Angular-styleguide: .component ๋„์šฐ๋ฏธ

์— ๋งŒ๋“  2016๋…„ 02์›” 11์ผ  ยท  5์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: johnpapa/angular-styleguide

Angular 1.5 ๋ฆด๋ฆฌ์Šค์™€ ํ•จ๊ป˜ .component() ๋ฐ”๋กœ ๊ฐ€๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์„ฑ ์š”์†Œ ์ง€์‹œ๋ฌธ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ์–ด๋–ค ์ œ์•ˆ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ํ•œ๋™์•ˆ ๋‹น์‹ ์˜ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์˜ ์—ด๋ ฌํ•œ ์ถ”์ข…์ž์˜€์œผ๋ฉฐ ์—ฌ๊ธฐ์— ๋‚ด๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ์“ฐ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ•„์š” ์—†๋Š” ์ž‘์€ ๊ฒƒ๋“ค์€ ํ˜ธ์ด์ŠคํŒ…๋œ ํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜ ๊ฐ’๊ณผ ๊ฐ™์€ ํŒŒ์ผ ์•ˆ์— ํ…œํ”Œ๋ฆฟ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

(function() {
  'use strict';

  var componentConfig = {
    template: generateTemplate(),
    bindings: {
      kpiVal: '=',
      kpiLabel: '=',
    },
  };

  angular
    .module('app.utils.kpi')
    .component('sfKpi', componentConfig);

  //
  function generateTemplate() {
    return [
      '<div class="sf_kpi">',
      '  <div class="sf_kpi__number">{{ $ctrl.kpiVal }}</div>',
      '  <div class="sf_kpi__label">{{ $ctrl.kpiLabel }}</div>',
      '</div>',
    ].join('');
  }
}());

๊ณ ๊ธ‰ ํ…œํ”Œ๋ฆฟ์˜ ๊ฒฝ์šฐ ํ…œํ”Œ๋ฆฟ์„ ๋ณ„๋„์˜ ํŒŒ์ผ์— ๋„ฃ๊ณ  'templateUrl' ์†์„ฑ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

(function() {
  'use strict';

  var componentConfig = {
    templateUrl: 'components/active-places/active-places.widget.html',
    controller: controller,
  };

  angular
    .module('app.widget.activeplaces')
    .component('activePlaces', componentConfig);

  /* <strong i="12">@ngInject</strong> */
  function controller($log, activityService) {
    var vm = this;

    vm.activities = [];
    vm.isLoading = true;

    vm.doFunnyStuff = doFunnyStuff;

    activate();

    function activate() {
      $log.info('๐Ÿ‘Š activating activePlaces component');

      activityService.getActivites()
        .then(fetchData)
        .catch(handleError)
        .finally(stopLoader);

      //
      function fetchData(activities) {
        vm.activities = activities;
        $log.log('๐Ÿ‘“ activePlaces activities fetched: ', activities);
      }
      function handleError(err){
        $log.error('๐Ÿ’ฅ problem fetching activePlaces data', err);
      }
      function stopLoader() {
        vm.isLoading = false;
        $log.info('๐Ÿ’ช activePlaces component started');
      }
    }

    // methods
    function doFunnyStuff() {
      vm.activities.push('yolo');
    }

  }

}());

๋˜ํ•œ $onInit hook์— ๋Œ€ํ•œ ๊ท€ํ•˜์˜ ์˜๊ฒฌ๊ณผ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”

Angular 1

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‘ ๋ฒˆ์งธ๋Š” @gkalpak ์ž…๋‹ˆ๋‹ค. @softsimon ์œ„์—์„œ ์ด ์ค„์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
.controller('ActivePlacesController', ActivePlacesController);

๋‚˜๋Š” ๋˜ํ•œ ์ด ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์˜ ์—ด๋ ฌํ•œ ํŒฌ์ž…๋‹ˆ๋‹ค.

@xavhan for $onInit ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

vm.$onInit = activate;

function activate() {
}

init ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  v1.5.0์—์„œ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@johnpapa ๋‹˜ ์€ ์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ์•ˆ๋‚ดํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  5 ๋Œ“๊ธ€

(function() {
  'use strict';

  var componentConfig = {
    bindings: {
        data: '<'
    },
    templateUrl: 'components/active-places/active-places.widget.html',
    controller: 'ActivePlacesController as vm',
  };

  angular
    .module('app.widget.activeplaces')
    .component('activePlaces', componentConfig)
    .controller('ActivePlacesController', ActivePlacesController);

  /* <strong i="5">@ngInject</strong> */
  function ActivePlacesController($log, activityService) {
    var vm = this;

    vm.activities = [];
    vm.isLoading = true;

    vm.doFunnyStuff = doFunnyStuff;

    // methods
    function doFunnyStuff() {
      vm.activities.push('yolo');
    }

  }

}());

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ ์ด ๋ฐฉ๋ฒ•์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

(function() {
  'use strict';

    angular
        .module('app.widget.activeplaces')
        .component('activePlaces', {
            bindings: {
                data: '<'
            },
            templateUrl: 'components/active-places/active-places.widget.html',
            controller: 'ActivePlacesController as vm',
         })
        .controller('ActivePlacesController', ActivePlacesController);

    function ActivePlacesController($log, activityService) {
        var vm = this;

        vm.activities = [];
        vm.isLoading = true;

        vm.doFunnyStuff = doFunnyStuff;

        // methods
        function doFunnyStuff() {
          vm.activities.push('yolo');
        }
    }

}());

์ด ๋ฐฉ๋ฒ•์œผ๋กœ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@softsimon : v1.5.0 ngMock#$componentController ๋ฅผ ๋„์ž…ํ•˜๋ฏ€๋กœ ํ…Œ์ŠคํŠธ ์šฉ์ด์„ฑ์„ ์œ„ํ•ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ณ„๋„๋กœ ๋“ฑ๋กํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค :smiley:

๋‘ ๋ฒˆ์งธ๋Š” @gkalpak ์ž…๋‹ˆ๋‹ค. @softsimon ์œ„์—์„œ ์ด ์ค„์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
.controller('ActivePlacesController', ActivePlacesController);

๋‚˜๋Š” ๋˜ํ•œ ์ด ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์˜ ์—ด๋ ฌํ•œ ํŒฌ์ž…๋‹ˆ๋‹ค.

@xavhan for $onInit ๊ท€ํ•˜์˜ ์˜ˆ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

vm.$onInit = activate;

function activate() {
}

init ๋ผ๊ณ  ๋ถ€๋ฅด๊ณ  v1.5.0์—์„œ ํ™œ์„ฑํ™”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@johnpapa ๋‹˜ ์€ ์ด์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹œ๋Š”์ง€ ์•ˆ๋‚ดํ•ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

:+1:

vm.$onInit = activate;

function activate() {
}

๊ตฌ์„ฑ ์š”์†Œ ํ† ๋ก ์„ ์œ„ํ•œ ์žฅ์†Œ๋กœ #766 ํ์‡„

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰