【问题标题】:AngularJS - remove bindings to avoid memory leaksAngularJS - 删除绑定以避免内存泄漏
【发布时间】:2012-11-30 12:01:57
【问题描述】:

AngularJS 中断开绑定的正确方法是什么?

我有一个非角度应用程序,它正在加载一个使用 angularjs 进行数据绑定的组件。在某些时候,我想销毁组件并希望确保没有内存泄漏。如何告诉 Angular 从 DOM 的那部分删除所有事件侦听器?

$(node).remove() 会做到这一点,还是 Angular 会在内存中做其他需要清理的事情......?任何其他有关避免角度内存泄漏的提示将不胜感激。

【问题讨论】:

    标签: javascript data-binding memory-leaks angularjs


    【解决方案1】:

    仅删除具有 remove() 之类的 Scope 的 DOM 元素不会删除内存中的 Scope。您可以通过删除一个元素并查看Batarang 来确认这一点,或者通过获取父作用域并检查它的子作用域来确认这一点。您会看到范围仍然存在......所以您还需要在 Scope 本身上调用 $destroy()

    More information about $destroy() can be found here.

    编辑:我不确定的一件事是,它是否会完全删除范围,或者只是断开它并让 JavaScript GC 处理其余部分。

    【讨论】:

    • 感谢您的快速回复!
    • 文档说还有一个 jQuery 事件可以解除范围和 DOM 元素的绑定,但没有给出示例用例。它只是找到元素范围,调用destroy方法然后使用jquery remove()的情况吗?奇怪的是,这个功能在 angular 中不作为一个完整的功能存在!
    • 如果您为 window.leak 分配一个范围,然后在 scope.$on('destroy',...) 上设置控制台日志,您将看到 destroy 被调用,但您仍然可以访问该范围从泄漏。
    • @Chris Stephens 如果将其添加到windom.leak,这不会阻止垃圾收集器处理它吗?
    • @thetallweeks 我也不太记得我回复了什么,但是我相信这是关于答案中的编辑,如果角度物理删除了范围,或者它只是为 GC 断开了它。如果你将它附加到窗口上,它会造成泄漏,这表明它不会物理删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-26
    • 2018-04-08
    • 2013-06-24
    • 1970-01-01
    相关资源
    最近更新 更多