当$ scope。$ watch表达式取决于多个变量时会发生什么?

时间:2015-09-30 16:14:01

标签: javascript angularjs watch

如果在我的控制器中,我有类似的东西:

$scope.service = Service;

$scope.$watch('service.properties[service.selectedProperty]', function(newVal,oldVal){});

这里发生了什么? service.propertiesservice.selectedProperty都可以更改。手表最终会同时观看service.propertiesservice.selectedProperty吗?

我测试了这个,当任何变量发生变化时,手表似乎都会执行,这就是我想要的。我想知道在使用.$watch这种方式时是否会产生任何意想不到的后果,以及它是如何运作的。

1 个答案:

答案 0 :(得分:2)

  

手表最终是否同时观看service.propertiesservice.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'的值也将保持不变。

只要表达式评估相同,从角度的角度来看,没有任何变化。对于大多数意图和目的,对你来说也不重要 - 如果确实如此,你的表情设置不正确,你可能想看一个更通用的表达。