如果在我的控制器中,则类似:

$scope.service = Service;

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


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

我已经对此进行了测试,并且当任何一个变量更改时,手表似乎都可以执行,这正是我想要的。我想知道以这种方式使用.$watch时是否会产生意想不到的后果,以及它实际上是如何工作的。

最佳答案

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

只要表达式的计算结果相同,就角度而言,什么都没有改变。对于大多数意图和目的,这也不对您有影响-如果确实如此,则您的监视表达式设置不正确,您可能希望监视更通用的表达式。

09-25 18:05
查看更多