看一个删除的模型?

时间:2016-01-13 09:32:12

标签: javascript angularjs angularjs-directive typescript

考虑这个伪代码:

$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的文档。

1 个答案:

答案 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

BTW,你的例子,在监听功能中添加观察者是非常奇怪的。 AngularJS不是jQuery,甚至在jQuery社区中也有人阻止绑定和解除绑定。有些人甚至将其称为反模式

更新:objectEquality AKA Deep-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