12

以下是来自 Angular 的文档。我正在查看属于此范围一部分的几个变量,以便为ng-grid. 当这个作用域被破坏时,我是否需要通过调用 from 的返回值来取消监视它们$scope.$watch,或者作用域的破坏是否足以处理这个问题?如果被监视的变量不是这个范围的一部分怎么办?

如果我不“取消监视”与范围一起被破坏的变量,我会泄漏内存/导致性能问题。


$destroy()

从父作用域中移除当前作用域(及其所有子作用域)。移除意味着调用$digest()将不再传播到当前作用域及其子作用域。删除还意味着当前范围有资格进行垃圾收集。

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

就在作用域被销毁之前,$destroy会在此作用域上广播一个事件。应用程序代码可以注册一个$destroy事件处理程序,这将使它有机会执行任何必要的清理。

请注意,在 AngularJS 中,还有一个$destroyjQuery 事件,可用于在从 DOM 中删除元素之前清理 DOM 绑定。

4

2 回答 2

18

快速查看源代码会告诉您,返回的删除函数$watch并没有做任何奇怪的事情。它只是从scope.$$watchers数组中删除一个项目。

因此,一旦作用域被销毁,整个数组就会随之消失,垃圾收集器将为您清理所有内容。

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

于 2013-12-21T16:17:51.647 回答
1

我也认为这应该在文档中明确解释。我从总是忽略scope.$watch(在 ngIf、ngShow、ngRepeat 等中)的结果的角度源代码中推断出不需要不观看。

于 2013-12-21T07:11:55.347 回答