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事件处理程序,使其有机会执行任何必要的清理.
我正在使用Socket.io v0.9.16和Chrome 34
我正在尝试删除特定的侦听器,或取消订阅特定的订阅
像这样的东西:
socket.on('testComplete',function(data){
console.log('test complete',data);
});
function emitTest(){
console.log('emitting test');
socket.emit('test','first emit');
}
function removeListener(){
socket.removeListener('testComplete');
}
Run Code Online (Sandbox Code Playgroud)
如果我调用该emitTest函数,然后调用该函数,我再次调用时removeListener仍会看到该'test complete'消息emitTest.如果套接字功能工作,则应该删除监听器.
我正在寻找一种方法来删除实际工作的特定侦听器.
这个答案说removeListener不起作用.
这样做是否有任何不利因素:
socket.removeListener=function(name){
if(socket.$events.hasOwnProperty(name)){
delete socket.$events[name];
}
};
Run Code Online (Sandbox Code Playgroud)
我将答案标记为正确,但我在我的代码中使用了上述代码,因为它对我的设计更有效.