似乎在更改对象属性时,会触发该对象上的监视 - 除非该属性设置为函数。
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开火。
答案 0 :(得分:2)
当您传递true作为最后一个参数时,Angular使用其对象相等函数来比较对象的过去和当前状态:
http://docs.angularjs.org/api/angular.equals
在属性比较期间,函数类型和属性的属性 名称以$开头的属性将被忽略。
我认为如果您想要触发手表,则必须在修改功能属性的同时更改其他属性。