第一次更新后,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:性能哪个更好?

angularjs 之 $watch

$watch 只触发一次

在 angularjs 的自定义指令的 $watch 中不评估表达式

如何在 AngularJS 中使用 $scope.$watch 和 $scope.$apply?