当范围被销毁时,我是否需要“监视”范围变量?

时间:2013-12-21 03:33:12

标签: angularjs angularjs-watch

以下是角度的文档。我正在观察几个属于此范围的变量,以构建ng-grid的过滤字符串。当这个范围被销毁时,我是否需要通过调用$scope.$watch的返回值来取消监视它们,或者是否足以破坏范围以解决这个问题?如果被监视的变量不属于此范围,该怎么办?

如果我不注意"" unwatch"我是否会泄漏内存/导致性能问题?与范围一起被销毁的变量。


$destroy()

从父作用域中移除当前作用域(及其所有子作用域)。删除意味着对$digest()的调用将不再传播到当前范围及其子项。删除还意味着当前范围符合垃圾收集的条件。

$destroy()通常由ngRepeat等指令用于管理循环的展开。

在销毁范围之前,会在此范围内广播$destroy个事件。应用程序代码可以注册一个$destroy事件处理程序,使其有机会执行任何必要的清理。

请注意,在AngularJS中,还有一个$destroy jQuery事件,可以在从DOM中删除元素之前清除DOM绑定。

2 个答案:

答案 0 :(得分:18)

快速查看源代码将向您显示$watch返回的删除功能不会做任何异国情调。它只是从scope.$$watchers数组中删除了一个项目。

因此,一旦范围被销毁,整个数组就会随之而来,垃圾收集器会为你清理所有内容。

无论您正在观看什么,手表本身都存储在示波器中。这就是为什么,为了使用$watch,您不会致电angular.$watch,而是致电$scope.$watch

答案 1 :(得分:1)

我还认为这应该在文档中明确说明。我已经推断出角度源代码不需要取消监视,它始终忽略scope.$watch的结果(在ngIf,ngShow,ngRepeat等中)。