当$scope.$watch表达式依赖于多个变量

What happens when $scope.$watch expression depends on multiple variables?

本文关键字:变量 依赖于 表达式 scope watch      更新时间:2023-09-26

如果在我的控制器中,我有这样的内容:

$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'

只要表达式的计算结果是相同的,从angular的角度来看,什么都没有改变。对于大多数意图和目的来说,这对您来说也不重要——如果是这样,则说明您的watch表达式设置不正确,您可能想要查看一个更通用的表达式。