如果在我的控制器中,我有类似的东西:
$scope.service = Service;
$scope.$watch('service.properties[service.selectedProperty]', function(newVal,oldVal){});
这里发生了什么? service.properties
和service.selectedProperty
都可以更改。手表最终会同时观看service.properties
和service.selectedProperty
吗?
我测试了这个,当任何变量发生变化时,手表似乎都会执行,这就是我想要的。我想知道在使用.$watch
这种方式时是否会产生任何意想不到的后果,以及它是如何运作的。
答案 0 :(得分:2)
手表最终是否同时观看
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'
的值也将保持不变。
只要表达式评估相同,从角度的角度来看,没有任何变化。对于大多数意图和目的,对你来说也不重要 - 如果确实如此,你的表情设置不正确,你可能想看一个更通用的表达。