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 触发。

4

1 回答 1

2

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

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

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

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

于 2013-06-05T21:55:51.177 回答