考虑这个伪代码:
$scope.model = [{ A: 'a', B: 'b' }, { A: 'c', B: 'd' }];
$scope.$watchCollection('model', (model) => {
for (var i = 0; i < model.length; i += 1) {
$scope.$watch('model[' + i + '].A', () => ...);
}
});
如果delete $scope.model[1]
,观察表达式会发生什么?它会是一个&#34;内存泄漏&#34;,一个僵尸,还是其他一些漏洞?
编辑此方法为已解决的问题提供了可怕的解决方案。我最终使用angularjs相等检查而不是引用检查。请参阅$ watch的文档。
答案 0 :(得分:2)
在摘要周期中,$watch
和$watchcollection
都会继续观看。如果再次定义了感兴趣的项目,则$rootScope
执行已注册的侦听器功能。您可以通过调用$watch
注册时返回的取消注册功能来取消注册观察程序。 (你做了保存它,不是吗?)
var deRegisterFn = $scope.$watchCollection('model', function (newValue) {
console.log(newValue);
});
delete $scope.model;
deRegisterFn();
否则观察者会一直存在,直到范围被破坏为止。
有关$watch
的详细信息,请参阅AngularJS $rootScope.scope API Reference -- $watch。
$watch(watchExpression, listener, [objectEquality]);
objectEquality == true
时,确定watchExpression
的不等式
根据{{3}}函数。保存对象的值
稍后比较,使用angular.equals函数。因此,这意味着
观看复杂的物体会产生不良的记忆和性能影响。出于性能原因,$watch
功能使用&#34;浅表&#34;。该问题的作者需要一个深刻的观察&#34;他的目标。不知道&#34; objectEquality&#34;选项,也称为(AKA)&#34;深度表&#34;选项,他通过添加和删除模型属性的手表解决了他的问题。深邃的手表&#34;选项以更清洁,更优雅的方式解决了他的问题。因此无需添加和删除手表。
有关$watch
的详细信息,请参阅angular.copy。