如果在我的控制器中,则类似:
$scope.service = Service;
$scope.$watch('service.properties[service.selectedProperty]', function(newVal,oldVal){});
这里会发生什么?
service.properties
和service.selectedProperty
都可以更改。手表最终是否同时观看service.properties
和service.selectedProperty
?我已经对此进行了测试,并且当任何一个变量更改时,手表似乎都可以执行,这正是我想要的。我想知道以这种方式使用
.$watch
时是否会产生意想不到的后果,以及它实际上是如何工作的。 最佳答案
手表最终是否同时观看service.properties
和service.selectedProperty
?
实际上,它既没有观察,也没有观察整个表达式的结果。我解释:
Angular监视使用肮脏的检查原理:如果整个表达式的计算结果不同于上一次计算的时间,则表示发生了更改,并且运行了相关的处理程序。 (当您使用$watch
形式将函数作为其第一个参数时,此行为就更加明显-返回要监视的值。)
从技术上讲,这意味着可能存在一种情况,其中service.properties[service.selectedProperty]
的评估与以前相同,但是与此同时,关联对象service.properties
和属性键service.selectedProperty
(或两者中的一个)都已更改-但是,表达式被评估为相同。在这种情况下,不会触发更改事件。
例如,给定:
var myObj = {
a: 123,
b: 123
};
var key = 'a';
即使将
myObj[key]
更改为key
而不是'b'
,表达式'a'
的值也将保持不变。只要表达式的计算结果相同,就角度而言,什么都没有改变。对于大多数意图和目的,这也不对您有影响-如果确实如此,则您的监视表达式设置不正确,您可能希望监视更通用的表达式。