2013-06-05 39 views
2

看起来,在更改对象属性时,该对象上的监视器会触发 - 除非将该属性设置为函数。

angular.module('app', []) 
.controller('ctrl', function($scope) { 

    $scope.object1 = {}; 
    $scope.object2 = {}; 

    $scope.clicked1 = function() { 
     $scope.object1.message = "Object1 property changed"    
    } 

    $scope.clicked2 = function() { 
     $scope.object1.fn = function() { 
      return "Object1 fn changed"; 
     } 
    } 

    $scope.$watch('object1', function(o) { 
     if (o.message) 
      $scope.object2.message = o.message + ', and watch fired'; 
     else if (o.fn) { 
      $scope.object2.message = o.fn(); 
     } 
    }, true); 
}); 

请参阅http://jsfiddle.net/TkWP6/。当clicked1被调用时,$ watch按照预期触发,但是当clicked2被调用时,什么都不会发生。

简单的问题是为什么不能,而且可以做任何事情来让$ watch手表着火。

回答

2

当你传递的最后一个参数属实,角使用其对象相等功能比较的对象的过去和现在的状态:

http://docs.angularjs.org/api/angular.equals

在属性对比,功能类型的属性和 名称以$开头的属性将被忽略。

我想如果你想手表触发,你将不得不在改变功能属性的同时改变一个额外的属性。

相关问题