2014-01-07 48 views
1

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

我已经阅读了开发人员指南:

“有AngularJS发出一些特殊事件,当已经编制与角的编译器DOM节点被破坏,它会发出$破坏事件。同样,当一个AngularJS范围被销毁时,它会向监听范围广播一个$ destroy事件,通过监听这个事件,你可以移除可能导致内存泄漏的事件监听器,注册到范围和元素的监听器会自动清理销毁了,但是如果你在一个服务上注册了一个监听器,或者在一个没有被删除的DOM节点上注册了一个监听器,那么你必须自己清理它,否则你可能会引入内存泄漏。“

在我的链接功能,我已经把这个代码的事件侦听器:

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

}); 

现在,我有没有考虑到作为一个DOM元素上的监听(所以我必须将其删除)或不?我有点困惑。

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

THX所有

+0

为什么你认为你将不得不删除监听器? –

+0

原因我不了解之前编写的文档中提到的“元素”和DOM节点之间的区别。我认为像element.on('click',someFunction)这样的事件不会被删除,而像$('#somenode')。on('click',somefunction)这样的事件必须被删除。这是对的吗? – ira

回答

0

答案是肯定的。由于您在AngularJS之外附加了一个事件处理程序,因此您需要自行清理它。

您可以通过听$destroy事件做到这一点:

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

[this stackoverflow answer](http://stackoverflow.com/a/27016855/3523645)说的相反。 – timetowonder

1

element.remove()被称为时自动一条指令被摧毁,从而去除元素的所有听众。如果您将它们附加到任何其他DOM元素,则只需手动删除DOM侦听器。

从角的documentation

听众注册范围和它们被破坏时,元素会被自动清除,但如果你注册了一个服务侦听器或注册的侦听器DOM节点上ISN” t被删除,你必须自己清理它,否则你可能会冒内存泄漏的风险。