我有一个以下形式的嵌套数组:
$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'}
从一个数组移动到另一个数组时,没有任何反应。如何将手表放在嵌套数组上?
答案 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
的更多细节