第一次更新后,AngularJS $watch 数组失败
Posted
技术标签:
【中文标题】第一次更新后,AngularJS $watch 数组失败【英文标题】:AngularJS $watch is failing for arrays after 1st update 【发布时间】:2013-10-03 00:04:37 【问题描述】:我需要跟踪作为数组的模型值何时被指令更新但 $watch 似乎失败了。我创建了一个小提琴来说明问题:
http://jsfiddle.net/DsTLN/
我设置了一个手表,以便在模型更改时执行操作。
$scope.$watch('model.title', function(newValue, oldValue)
if ($scope.model)
console.debug("watchedTitle=" + newValue);
$scope.watchedTitle = newValue ;
);
如果模型 newValue 是整数,则 $watch 会如调试日志所示持续触发:
watchedTitle=1
watchedTitle=2
watchedTitle=3
watchedTitle=4
watchedTitle=5
我设置了第二个手表来监控数组的变化:
$scope.$watch('model.titlearray', function(newValue, oldValue)
如果 newValue 是一个数组 $watch 只在第一次使用时触发:
watchedTitlearray: 1
之后我的第二只手表就没有开火了。
知道我做错了什么吗?
【问题讨论】:
【参考方案1】:为了观察列表中元素的变化,将$watch
的第三个参数设置为true
$scope.$watch('model.titlearray', function(newValue, oldValue)
// ...
, true);
【讨论】:
【参考方案2】:在 Angular 1.2 中,您应该使用:
$scope.$watchCollection('model.titlearray', function(newValue, oldValue)
// ...
);
http://docs.angularjs.org/api/ng.$rootScope.Scope
【讨论】:
【参考方案3】:正如sza所说,你需要将$watch的第三个参数设置为true。这样您就可以比较两个对象的相等性,而不是通过引用,如 angular scope docs
中所述$watch(watchExpression, listener, objectEquality)
objectEquality(可选) - 布尔值 - 比较对象是否相等而不是参考。
我修复了你的 jsfiddle,让它按照你想要的方式工作,这里是链接:http://jsfiddle.net/r4zce/
【讨论】:
以上是关于第一次更新后,AngularJS $watch 数组失败的主要内容,如果未能解决你的问题,请参考以下文章
AngularJS:$scope.$watch 没有更新从自定义指令上的 $resource 获取的值
AngularJS $watch 与 $watchCollection:性能哪个更好?