当作用域被破坏时,我是不是需要“取消监视”作用域变量?

Posted

技术标签:

【中文标题】当作用域被破坏时,我是不是需要“取消监视”作用域变量?【英文标题】:Do I need to "unwatch" scope variables when the scope is being destroyed?当作用域被破坏时,我是否需要“取消监视”作用域变量? 【发布时间】:2014-01-09 23:51:24 【问题描述】:

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

如果我不“取消监视”与作用域一起被销毁的变量,我是否会泄漏内存/导致性能问题。


$destroy()

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

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

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

范围被破坏了......什么时候?当附加控制器的 html 块被其他东西替换时? 虽然您可能不会显式销毁您的范围,但当父范围被销毁时,它及其子范围no longer 参与$digest cycle。特别是,观察者没有被调用,事件没有到达。如果元素从页面中消失,那么假设某些父作用域被破坏可能是安全的。你可以尝试一下here。【参考方案2】:

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

【讨论】:

以上是关于当作用域被破坏时,我是不是需要“取消监视”作用域变量?的主要内容,如果未能解决你的问题,请参考以下文章

当表格视图滚动时,UIImageView Aspect to Fit 不起作用

Python中的作用域

Angular 2/4 模板缓存破坏不起作用

.Send 不起作用时如何发送邮件?

闭包函数与装饰器

当查询字段为objectId时,geoNear聚合是不是不起作用?