2013-07-25 26 views
21

在我的應用程序中有一個沉重的內存泄漏,但我沒有找到原因,這裏是背景。當角開始銷燬時,我們是否需要在指令中解除綁定事件偵聽器?

  • 我使用AngularJS + JQuery的(插件)
  • 許多聽衆也必然像下面這樣:

    $(元素)。在( 「KEYUP」,函數(){});

所以,問題是

我需要通過以下取消綁定這些聽衆中的指令?

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

BTW,你通常如何找出一個Web應用程序的內存泄漏? 我使用鉻的配置文件(請參閱Profiling memory performance) 但我無法追溯到內存泄漏的代碼。你有什麼建議嗎?

非常感謝!

+0

這就是需要的,除非你是結合所有範圍爲$ rootScope我不認爲。 –

+1

您不必刪除它們,它們通常會被垃圾收集。您可能確實想要移除窗口的偵聽器,但如果處理程序與範圍的元素進行交互,就像滾動或消息事件一樣。請參閱http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory – Kapep

回答

14

作用域破壞的角度文檔意味着您確實需要刪除DOM事件。

http://docs.angularjs.org/api/ng.$rootScope.Scope#$destroy

需要注意的是,在AngularJS,也有$摧毀jQuery的事件,這 才能使用的元素從 DOM中移除清理DOM綁定。

+0

感謝您的回答,我沒有解綁那些聽衆$銷燬進程,但似乎對我的內存泄漏問題沒有幫助。嗯... – Edward

+0

我剛剛發現$ destroy evnet實際上是在dom被刪除後觸發的(提交另一個bug的時間,我認爲 – Blowsie

+1

@Blowsie有兩種$ destroy事件,一個是$ scope 。$ on('$ destroy',cb)在元素移除之前被調用,另一個元素是element.on('$ destroy',cb),它是一個jQ事件,在元素移除後被調用,一定要使用正確的 –

4

我必須不同意接受的答案,你的內存泄漏可能有其他原因。

退房此爲外觀極好答案:AngularJS - Does $destroy remove event listeners?

+0

我檢查過這個帖子,但我不明白你爲什麼這麼認爲?當我刪除監聽器後,我的內存問題已經解決了 – Edward

+3

當Angular刪除了一個與指令相關的元素時,它調用了jQuery/jqLit​​e '$ elem.remove()'函數,其中應該刪除此元素和子元素的任何事件偵聽器。「清理DOM綁定」可以引用綁定到「window」或「document」的事件,或者保存在內存中的元素並以編程方式添加到dom中(可能使用「append」和「detach」) –

+5

這兩個答案都是部分正確:角度調用刪除,但只會取消註冊指令所在元素及其後代的事件。如果您要將事件處理程序註冊到外部的節點(例如說明文檔),則不會清除它。在$ destroy – BiAiB

相關問題