2014-01-07 44 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被刪除,你必須自己清理它,否則你可能會冒內存泄漏的風險。