https://docs.angularjs.org/guide/directive
通过侦听此事件,您可以删除可能导致内存泄漏的事件侦听器.注册到范围和元素的监听器在销毁时会自动清理,但如果您在服务上注册了监听器,或者在未删除的DOM节点上注册了监听器,则必须自行清理或者你冒着引入内存泄漏的风险.
最佳实践:指令应该自行清理.您可以使用element.on('$ destroy',...)或范围.$ on('$ destroy',...)来删除指令时运行清理函数.
题:
element.on "click", (event) ->我的指令里面有一个:
element.on以防止它被垃圾收集?$destroy发出的事件上的事件侦听器.我的印象是destroy()删除了事件监听器,是不是这样?有人可以提供范围的$ destroy事件的例子吗?以下是http://docs.angularjs.org/api/ng.$rootScope.Scope#$destroy的参考文档.
$摧毁()
从父作用域中删除当前作用域(及其所有子作用域).删除意味着对$ digest()的调用将不再传播到当前范围及其子节点.删除还意味着当前范围符合垃圾收集的条件.
$ destroy()通常由诸如ngRepeat之类的指令用于管理循环的展开.
在范围被销毁之前,在此范围内广播$ destroy事件.应用程序代码可以注册$ destroy事件处理程序,使其有机会执行任何必要的清理.
我的应用程序中存在大量内存泄漏但我没有找到原因,这是后台.
许多听众受到如下约束:
$(element).on("keyup",function(){});
所以问题是
我是否需要通过以下方式取消绑定指令中的听众?
scope.$on("$destroy", function() {
$(element).off();
});
Run Code Online (Sandbox Code Playgroud)
顺便说一句,你如何找到Web应用程序中的内存泄漏?我使用chrome的配置文件(请参阅此处分析内存性能),但我无法跟踪内存泄漏的代码.你有什么建议吗?
非常感谢!
在Angular中,范围与DOM元素相关联.如果你打电话$element.remove(),$element.scope().$destroy()最终也会被召唤?或者开发人员是否负责自己清理范围?
这让我觉得删除DOM元素会自动删除范围:
angular.js
/////////////////////////////////////////////
// jQuery mutation patch
//
// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a
// $destroy event on all DOM nodes being removed.
//
/////////////////////////////////////////////
function JQLitePatchJQueryRemove(name, dispatchThis) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)