我正在尝试在AngularJS中实现一个简单的指令。特别是我想开发一个加载按钮,在按下时改变它的方面,我想在我需要它的应用程序的所有页面中重用它。
我已阅读开发者指南:
“AngularJS会发出一些特殊事件。当使用Angular编译器编译的DOM节点被销毁时,它会发出$ destroy事件。同样,当一个AngularJS范围被销毁时,它会广播一个$ destroy事件通过监听此事件,您可以删除可能导致内存泄漏的事件侦听器。注册到范围和元素的侦听器在销毁时会自动清除,但是如果您在服务上注册了侦听器,或者注册了侦听器在未被删除的DOM节点上,您必须自己清理它,否则可能会导致内存泄漏。“
在我的链接函数中,我已将此代码用于事件侦听器:
var onLoaderButtonClickEvent = element.on('click', function(){
//Some stuff
});
现在,我是否应该将其视为DOM元素的监听器(所以我必须删除它)?我有点困惑。
我认为我没有删除监听器,因为它位于“元素”上。这是对的吗?
Thx to all
答案 0 :(得分:2)
销毁指令时会自动调用element.remove()
,从而删除元素上的所有侦听器。如果将DOM侦听器附加到任何其他DOM元素,则只需手动删除它们。
来自角色documentation:
注册到范围和元素的监听器在销毁时会自动清理,但是如果您在服务上注册了监听器,或者在未被删除的DOM节点上注册了监听器,那么您将会被清除。必须自己清理它,否则你可能会引起内存泄漏。
答案 1 :(得分:1)
答案是是。当你在AngularJS之外附加一个事件处理程序时,你需要自己清理它。
您可以通过收听$destroy
事件来执行此操作:
scope.$on('$destroy', function(){
element.off('click');
});