2014-11-24 46 views
1

我發現了一些資源,建議在渲染另一個主體視圖之前顯式刪除主幹視圖。主幹內存泄漏:始終在render()之前執行remove()

現在還是這樣嗎?我應該在當前視圖上調用remove(),如果我想導航到另一個路線並呈現另一個視圖?當我在at時,當我做$('body')。html(...) - 'body'中的現有內容會發生什麼時,它會被刪除並被垃圾收集嗎?

+1

是的,你應該調用'remove',這就是所有視圖的清理應該在哪裏。檢查[jQuery文檔](http://api.jquery.com/html/#html2)以查看$('body')。html(...)將執行什麼操作。 – 2014-11-24 17:31:20

回答

2

這取決於你在做什麼。但作爲一種良好的做法,建議使用視圖中的remove()方法。

如果您在jQuery中使用Backbone,並且沒有將偵聽器綁定到您的模型/集合,則不需要在渲染前刪除元素。

原來,如果您嘗試使用jQuery替換元素內容,lib將處理子項,數據和關聯事件刪除。 jQuery的文檔說:

.html()用於設置元素的內容時,該元素中的任何內容將被新內容完全替換。另外,在用新內容替換這些元素之前,jQuery會從子元素中移除其他構造,例如數據和事件處理程序。

但如果你綁定您的視圖和模型/集之間的事件,你應該從骨幹做stopListening,或該活動將在你的骨幹分子的事件堆棧,直到您刷新相關的模型/收集相關。

通過執行骨幹視圖remove方法,您將執行jQuery remove()和Backbone stopListening()

+2

現貨。非常感謝,正是我想知道的。有點奇怪,儘管我看到了很多不執行remove()的代碼,儘管視圖中有listenTo。 – Yaro 2014-11-25 00:54:44

0

這些觀點背後的理論邏輯是,它們是不能被垃圾收集只要有任一對象:

  • 甲參照DOM,
  • 另一個目的,諸如模型,該模型綁定到視圖並監聽某些事件。

根據您對@GabrielGartz的答案最後的評論:

你之所以會叫jQuery的remove()是因爲它會刪除對DOM的引用。 Afaik,Backbone使用jquery的on來收聽與視圖的el及其子元素(這些事件冒泡)相關的事件。 jquery的remove()清除這些DOM監聽器。

jQuery的文檔:

類似於.empty()時,卸下襬臂()方法接受元件出 DOM的。使用一個.remove()時,你要刪除的元素本身,以及 因爲它裏面的一切。除了元素本身,所有 結合事件和與該元件相關聯的jQuery數據被去除。 要刪除的要素而不除去的數據和事件,使用.detach() 代替。

的DOM引用是從骨幹查看無關,作爲一個對象會採取一個模型作爲使用listenTo聽,可以從應用程序的其他部分廣播事件的屬性。

我希望這會有所幫助。