以下是角度的文档。我正在观察几个属于此范围的变量,以构建ng-grid
的过滤字符串。当这个范围被销毁时,我是否需要通过调用$scope.$watch
的返回值来取消监视它们,或者是否足以破坏范围以解决这个问题?如果被监视的变量不属于此范围,该怎么办?
如果我不注意"" unwatch"我是否会泄漏内存/导致性能问题?与范围一起被销毁的变量。
$destroy()
从父作用域中移除当前作用域(及其所有子作用域)。删除意味着对$digest()
的调用将不再传播到当前范围及其子项。删除还意味着当前范围符合垃圾收集的条件。
$destroy()
通常由ngRepeat
等指令用于管理循环的展开。
在销毁范围之前,会在此范围内广播$destroy
个事件。应用程序代码可以注册一个$destroy
事件处理程序,使其有机会执行任何必要的清理。
请注意,在AngularJS中,还有一个$destroy
jQuery事件,可以在从DOM中删除元素之前清除DOM绑定。
答案 0 :(得分:18)
快速查看源代码将向您显示$watch
返回的删除功能不会做任何异国情调。它只是从scope.$$watchers
数组中删除了一个项目。
因此,一旦范围被销毁,整个数组就会随之而来,垃圾收集器会为你清理所有内容。
无论您正在观看什么,手表本身都存储在示波器中。这就是为什么,为了使用$watch
,您不会致电angular.$watch
,而是致电$scope.$watch
。
答案 1 :(得分:1)
我还认为这应该在文档中明确说明。我已经推断出角度源代码不需要取消监视,它始终忽略scope.$watch
的结果(在ngIf,ngShow,ngRepeat等中)。