当$scope.$watch表达式依赖于多个变量
What happens when $scope.$watch expression depends on multiple variables?
如果在我的控制器中,我有这样的内容:
$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'
。
只要表达式的计算结果是相同的,从angular的角度来看,什么都没有改变。对于大多数意图和目的来说,这对您来说也不重要——如果是这样,则说明您的watch表达式设置不正确,您可能想要查看一个更通用的表达式。
- 依赖于缓慢加载javascript的UI
- 如何隐藏&使用jQuery禁用依赖于另一个字段值的字段
- Node.js中依赖于版本的类型继承
- 如何使AngularJS控制器依赖于通过ajax加载在rootScope上的值
- 如何使用EnquireJS使AngularJS范围变量依赖于媒体查询
- Ajax xml源解析依赖于jQuery的点击操作
- Sails.js日志传输依赖于环境
- 离子选择不会更新依赖于作用域变量的功能
- 如何选择具有依赖于 javascript 变量的 id 的行
- 如何更改依赖于变量的计时器
- 试图将依赖于gulp环境的web包变量传递到angularjs应用程序中
- 当$scope.$watch表达式依赖于多个变量
- JavaScript, Ajax,Json:如何使用一个值依赖于Json响应的变量
- 如何使用RquireJS加载一个定义了全局变量并依赖于另一个第三方库的JS库
- 用mocha测试依赖于环境变量process.env.APP_ENV的配置模块
- 在制作多人游戏时,我是否依赖于浏览器不提供变量给玩家?
- 如何创建依赖于普通变量、函数或逻辑的ember属性
- 是否可以使一个变量的值依赖于对另一个变量的更改(有时在延迟之后)?
- NodeJS:我的节点文件依赖于其他文件中的变量
- AngularJS变量依赖于作用域中的另一个变量