为什么我的$ watch没有被调用?

时间:2013-10-28 15:14:33

标签: angularjs angularjs-directive angularjs-scope

我只是不明白为什么我的$ watch是 NOT 第二次使用“实体”的更新值进行调用。

  .directive('myParent', function() {
  return {
    controller: function($scope, $log) {
      $scope.$on('thingChanged', function(e, newVal) {
        $log.log('thingChanged event hit...');
        $scope.$apply(function() {
           $scope.thing = newVal;
        });
      });
    },
    template: '<div><div my-child entity="thing" v="{{thing.awesome}}"></div><div my-child2></div></div>'
  };
})
.directive('myChild', function($parse, $log) {
  return {
    controller: function($scope) {
    },
    scope: {
      entity: '=',
      v: '@'
    },
    link: function(scope, element, attrs) {
      $log.log('v in link:');
      $log.log(scope.v);
      attrs.$observe('v', function(v) {
        $log.log('v in observe in link:');
        $log.log(v);
      })
      $log.log('entity in link:');
      $log.log(scope.entity);
      scope.$watch(scope.entity, function(nv, ov) {
        $log.log('$watch detected change: ');
        $log.log(scope.entity);
      });
    }, 
    template: '<span>{{v}}</span>-<span>{{entity}}</span>'
  };
})
.directive('myChild2', function($parse, $log, $timeout) {
  return {
    controller: function($scope) {
      var count = 0;

      $timeout(function() {
        $scope.$emit('thingChanged', { awesome: 'cool'+count++ });
      }, 2000);
    },
    scope: true,
    link: function(scope, element, attrs) {
    }, 
    template: '<span><button ng-click="change()"</span>'
  };
})

Plunker:http://plnkr.co/edit/2jfa1dcwguO400zRjJxU?p=preview

1 个答案:

答案 0 :(得分:2)

Watch应该是要监视的属性的名称,请尝试scope.$watch("entity", ...,如果要深入监视(即对象属性),请使用true作为最后一个参数。

scope.$watch("entity", function() { ... }, true);