带有嵌套数组的$ watchCollection()

时间:2014-09-12 07:39:31

标签: javascript arrays angularjs

我有一个以下形式的嵌套数组:

$scope.itinerary = 
    [
        [
          {name:'x'},
          {name:'y'},
          {name:'z'}
        ],
        [
          {name:'a'},
          {name:'b'},
          {name:'c'}
        ]
    ]

我正在使用以下内容进行$ watchCollection:

$scope.$watchCollection(function () {
            return $scope.itinerary;
        }, 
        function () {
            console.log("Changed")
        }
);

console.log()仅在删除其中一个子数组或插入新数组时执行。如果我将元素从一个数组移动到另一个数组,则没有任何反应。 (例如,当我将{name:'a'}从一个数组移动到另一个数组时,没有任何反应。如何将手表放在嵌套数组上?

2 个答案:

答案 0 :(得分:8)

使用深表 $ watch()函数接受"对象相等的第三个可选参数。"如果你传入" true"对于这个参数,AngularJS实际上将执行深层对象树比较。这意味着在每个$摘要中,AngularJS将检查新旧值是否具有相同的结构(不仅仅是相同的物理参考)。这使您可以监控更大的景观;然而,深度对象树的比较在计算上要贵得多。

$scope.$watch('itinerary',function (newVal,oldVal) {
          console.log(newVal)      

 },true);

答案 1 :(得分:1)

不应使用$ watchCollection,而应使用$ watch并将第三个参数设置为true。

这样可行,但如果数组很大,对性能也是一个坏主意,所以请谨慎使用。

使用angular.eaquals与使用angular.copy获得的复制对象进行比较。

https://docs.angularjs.org/api/ng/type/ $ rootScope.Scope#$ watch

的更多细节