3

我需要跟踪作为数组的模型值何时被指令更新,但 $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 

之后我的第二只手表没有开火。

知道我做错了什么吗?

4

3 回答 3

6

为了观察列表中元素的变化,将第三个参数设置$watchtrue

$scope.$watch('model.titlearray', function(newValue, oldValue) {
    // ...
}, true);  
于 2013-09-26T20:38:11.403 回答
4

在 Angular 1.2 中,您应该使用:

$scope.$watchCollection('model.titlearray', function(newValue, oldValue) {
    // ...
});

http://docs.angularjs.org/api/ng.$ro​​otScope.Scope

于 2013-09-26T20:50:23.350 回答
1

正如 sza 所说,您需要将 $watch 的第三个参数设置为 true。这样您就可以比较两个对象的相等性而不是引用,如角度范围文档中所述

$watch(watchExpression, listener, objectEquality)
  • objectEquality (optional) - Boolean - 比较对象是否相等而不是参考。

我修复了您的 jsfiddle,使其按您预期的方式工作,这是链接:http: //jsfiddle.net/r4zce/

于 2013-09-26T21:28:31.720 回答