从AngularJS中的指令中删除事件侦听器

时间:2014-01-07 20:52:53

标签: angularjs events dom listener element

我正在尝试在AngularJS中实现一个简单的指令。特别是我想开发一个加载按钮,在按下时改变它的方面,我想在我需要它的应用程序的所有页面中重用它。

我已阅读开发者指南:

  

“AngularJS会发出一些特殊事件。当使用Angular编译器编译的DOM节点被销毁时,它会发出$ destroy事件。同样,当一个AngularJS范围被销毁时,它会广播一个$ destroy事件通过监听此事件,您可以删除可能导致内存泄漏的事件侦听器。注册到范围和元素的侦听器在销毁时会自动清除,但是如果您在服务上注册了侦听器,或者注册了侦听器在未被删除的DOM节点上,您必须自己清理它,否则可能会导致内存泄漏。“

在我的链接函数中,我已将此代码用于事件侦听器:

var onLoaderButtonClickEvent = element.on('click', function(){
//Some stuff

});

现在,我是否应该将其视为DOM元素的监听器(所以我必须删除它)?我有点困惑。

我认为我没有删除监听器,因为它位于“元素”上。这是对的吗?

Thx to all

2 个答案:

答案 0 :(得分:2)

销毁指令时会自动调用element.remove(),从而删除元素上的所有侦听器。如果将DOM侦听器附加到任何其他DOM元素,则只需手动删除它们。

来自角色documentation

  

注册到范围和元素的监听器在销毁时会自动清理,但是如果您在服务上注册了监听器,或者在未被删除的DOM节点上注册了监听器,那么您将会被清除。必须自己清理它,否则你可能会引起内存泄漏。

答案 1 :(得分:1)

答案是。当你在AngularJS之外附加一个事件处理程序时,你需要自己清理它。

您可以通过收听$destroy事件来执行此操作:

scope.$on('$destroy', function(){
    element.off('click');
});