当object属性设置为函数时,$ watch不会触发

时间:2013-06-05 21:26:17

标签: angularjs angularjs-scope

似乎在更改对象属性时,会触发该对象上的监视 - 除非该属性设置为函数。

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开火。

1 个答案:

答案 0 :(得分:2)

当您传递true作为最后一个参数时,Angular使用其对象相等函数来比较对象的过去和当前状态:

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

  

在属性比较期间,函数类型和属性的属性   名称以$开头的属性将被忽略。

我认为如果您想要触发手表,则必须在修改功能属性的同时更改其他属性。