Angular-styleguide: ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” $scope.watch

์— ๋งŒ๋“  2015๋…„ 07์›” 17์ผ  ยท  12์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: johnpapa/angular-styleguide

์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€์ฐฐํ•˜๋Š” ์˜ˆ( Style Y032 )์—์„œ๋Š” ๋ทฐ์— SomeController as vm ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ์Šค๋‹ˆํŽซ์ด ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๋ทฐ์— ์—ฐ๊ฒฐํ•œ๋‹ค๋Š” ์ ์„ ๋ถ„๋ช…ํžˆ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ์ด๊ฒƒ์€ ์ „์ฒด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ๊ตฌ๋ฌธ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ์˜ ๋‹จ์ ์ž…๋‹ˆ๋‹ค. $scope.watch์˜ ํ•จ์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ฑฐ๋‚˜ ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ œ์— ๋Œ€ํ•ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Angular 1 enhancement help wanted

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

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ† ๋ก ์„ ์š”์•ฝํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


์ปจํŠธ๋กค๋Ÿฌ๋กœ $watch

[์Šคํƒ€์ผ[Y999](#style-y999)]
  • $scope.$watch๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋Œ€์‹  ng-change ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

    _์™œ?_: ์‹œ๊ณ„๋Š” ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋ชจ๋“  $digest ๋ฃจํ”„์—์„œ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์—๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    /* avoid */
    function SomeController($scope) {
    var vm = this;
    
    $scope.$watch(function () {
        return vm.title;
    }, doSomething);
    
    function doSomething() {
    }
    }
    
    <!-- recommended -->
    <input type="text" ng-model="vm.title" ng-change="vm.doSomething()"/>
    
    /* recommended */
    function SomeController() {
      var vm = this;
      vm.doSomething = doSomething;
    
      function doSomething() {
      }
    }
    

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

๋‹น์‹ ์ด ์ข‹์•„ํ•œ๋‹ค๋ฉด PR

controller as ์™€ ํ•จ๊ป˜ $scope.$watch controller as ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์„ ๋„์ž…ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

$scope.$watch(function () {
    return vm.title;
}, function(current, original) {
    $log.info('vm.title was %s', original);
    $log.info('vm.title is now %s', current);
});

์ด์ „ ์˜ˆ๋ฅผ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ๋‘˜ ๋‹ค ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๊ท€ํ•˜์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•œ๋‹ค๋ฉด ๋‘˜ ๋‹ค ๋น„๊ตํ•˜๊ณ  ๊ท€ํ•˜์˜ ํ”ผํ•˜๊ณ  ๊ถŒ์žฅ๋˜๋Š” ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ธŒ๋ฅด๋ฅด ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด๋ถ€์—์„œ ์•ˆํ‹ฐ ํŒจํ„ด์„ ๊ด€์ฐฐํ•ฉ๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์ด ์˜ˆ์ œ์—์„œ๋Š” ์‹ค์ œ๋กœ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด Ng2์—์„œ ํ•  ์ผ์ด๋ผ๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค).

๋‚˜๋Š” ์ด ํ† ๋ก ์„ "ControllerAs"์˜ ํ•˜์œ„ ์„น์…˜์œผ๋กœ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด ์„น์…˜์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ปจํŠธ๋กค๋Ÿฌ ๋‚ด๋ถ€๋ฅผ ๋ณด์ง€ ์•Š๋„๋ก ์ด‰๊ตฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ "ํ•„์š”ํ•˜๋‹ค๋ฉด" @Jandalf ๋ฒ„์ „์„ ์‚ฌ์šฉํ•˜๊ณ  'vm.title' ํ‘œํ˜„์‹์„ ํ‰๊ฐ€ํ•  ๋•Œ์˜ ์œ„ํ—˜์— ๋Œ€ํ•ด ํฌ๊ฒŒ

์ด ๋ฏธ๋ฆฌ๋ณด๊ธฐ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์„ธ์š”?

์ปจํŠธ๋กค๋Ÿฌ์™€ $watch

[Style Y999 ] // ๋‹ค์Œ ๋นˆ ๋ฒˆํ˜ธ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ฐธ๊ณ : ๋‹ค์ด์ œ์ŠคํŠธ ์ฃผ๊ธฐ์— ๋” ๋งŽ์€ ๋กœ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฏ€๋กœ ์ฃผ์˜ํ•ด์„œ ์‹œ๊ณ„๋ฅผ ๋งŒ๋“œ์‹ญ์‹œ์˜ค. ๋Œ€์‹  ngChange ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

  • $scope.$watch ์˜ ํ•จ์ˆ˜ ํ‘œ๊ธฐ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ํ™•์ธ

_์™œ?_: ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ vm ๋‹ค์Œ ๋‹ค๋ฅธ ๊ฐ’์— ๋ฐ”์ธ๋”ฉ๋  ์ˆ˜ ์žˆ์Œ

๋”ฐ๋ผ์„œ ๊ฐ’์„ ์‹ค์ œ๋กœ ๊ด€์ฐฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋‹ค์Œ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์„ธ์š”.

  <input ng-model="vm.title"/>
  function SomeController($scope, $log) {
      var vm = this;

      $scope.$watch(function () {
          return vm.title;
      }, function(current, original) {
          $log.info('vm.title was %s', original);
          $log.info('vm.title is now %s', current);
      });
  }

ํ 

์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‹œ์ฒญํ•˜๋Š” ๊ฒƒ์€ ํ”ผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹  ngChange๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค. ๋˜๋Š” ์‹œ๊ณ„๋ฅผ ์ง€์‹œ๋ฌธ์œผ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. ์ƒ๊ฐ?

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚ด๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์„ ๋Œ€์ฒดํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋Š” controllerAs์™€ ํ•จ๊ป˜ watch๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ๊ทœ์น™์ž…๋‹ˆ๋‹ค.

๋™์˜ํ•ด, ์กด.

์ปจํŠธ๋กค๋Ÿฌ์˜ ๊ฐ์‹œ๋ฅผ ํ”ผํ•ด์•ผ ํ•˜๊ณ  ๋ณ€๊ฒฝ ์ด๋ฒคํŠธ๋ฅผ ์ˆ˜์‹ ํ•˜๊ฑฐ๋‚˜ ์ง€์‹œ๋ฌธ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์„ ํ˜ธ๋˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ์กฐ์–ธ์—๋„ "์ด์œ "๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์ปจํŠธ๋กค๋Ÿฌ์˜ ์‹œ๊ณ„๊ฐ€ ๋‚˜์œ ์ด์œ )

๊ทธ๊ฒƒ์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์กฐ์–ธ์€ _๊ผญ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด_ ๋ณ„๊ฐœ์˜ ์š”์ ์ด์–ด์•ผ ํ•˜๋ฉฐ ๋ฐ˜๋ณต์ ์œผ๋กœ ๊ฐ•๋ ฅํ•œ ๊ฒฝ๊ณ ๋กœ ์‹œ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜๋Š” ์™œ ๊ทธ๊ฒƒ์„ ํ•˜๊ณ  ์‹ถ์€์ง€์— ๋Œ€ํ•œ ์‚ฌ๋ก€๋ฅผ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์—ฌ๊ธฐ์— ํ•˜๋‚˜๋ฅผ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ํ•˜๋‚˜๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

๊ทธ๋Ÿฌํ•œ ์˜ˆ๊ฐ€ ์—†๋‹ค๋ฉด ๋‚˜๋Š” ์ด ์กฐ์–ธ์„ ์ „ํ˜€ ํฌํ•จํ•˜๊ธฐ๋ฅผ ๊บผ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ด ํ…์ŠคํŠธ์˜ "์™œ"๊ฐ€ ์ €๋ฅผ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ–ˆ์Šต๋‹ˆ๋‹ค. "vm" ์ด๋ฆ„์— ๋Œ€ํ•œ ์ข…์†์„ฑ์„ ํ”ผํ•˜๋Š” ํŠน์ • ๊ธฐ์ˆ ์— ๋Œ€ํ•œ "์ด์œ "์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ง„์งœ ์ด์œ ์— ๋ถ€์ฐจ์ ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์‹œ์ฒญํ•˜๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค. "์ด๋Ÿฐ ์‹์œผ๋กœ ํ•˜์ง€ ๋งˆ์„ธ์š”" ์˜ˆ์ œ๊ฐ€ ์•ž์— ์˜ค๋Š” ๊ฒฝ์šฐ์—๋งŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ์ œ์•ˆ?

๋‚˜๋Š” ์ด๊ฒƒ์ด ํ† ๋ก ์„ ์š”์•ฝํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค.


์ปจํŠธ๋กค๋Ÿฌ๋กœ $watch

[์Šคํƒ€์ผ[Y999](#style-y999)]
  • $scope.$watch๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ๋Œ€์‹  ng-change ๋˜๋Š” ์‚ฌ์šฉ์ž ์ง€์ • ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

    _์™œ?_: ์‹œ๊ณ„๋Š” ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต๊ณ  ๋ชจ๋“  $digest ๋ฃจํ”„์—์„œ ํ‰๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์—๋„ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    /* avoid */
    function SomeController($scope) {
    var vm = this;
    
    $scope.$watch(function () {
        return vm.title;
    }, doSomething);
    
    function doSomething() {
    }
    }
    
    <!-- recommended -->
    <input type="text" ng-model="vm.title" ng-change="vm.doSomething()"/>
    
    /* recommended */
    function SomeController() {
      var vm = this;
      vm.doSomething = doSomething;
    
      function doSomething() {
      }
    }
    

๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ - http://stackoverflow.com/questions/37698263/slick-carousel-angular-dynamic-data-loading ๋ฐ http://stackoverflow.com/questions/37746972/load-the-view- template-once-server-response-received-in-angularjs-app

controllerAs๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์‹œ๋ฌธ ๋‚ด์—์„œ $watch๋ฅผ ๋ฌธ์„œํ™”ํ•ฉ๋‹ˆ๊นŒ? ๋งํฌ๋‚˜ ์ž๋ฃŒ๋ฅผ ์ถ”์ฒœํ•ด์ฃผ์‹ค ์ˆ˜ ์žˆ๋‚˜์š”?

PR์— ๊ด€์‹ฌ์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚ด ์˜ค๋ž˜๋œ ๋ฌธ์ œ ์ •๋ฆฌ

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