我發現了一些資源,建議在渲染另一個主體視圖之前顯式刪除主幹視圖。主幹內存泄漏:始終在render()之前執行remove()
現在還是這樣嗎?我應該在當前視圖上調用remove(),如果我想導航到另一個路線並呈現另一個視圖?當我在at時,當我做$('body')。html(...) - 'body'中的現有內容會發生什麼時,它會被刪除並被垃圾收集嗎?
我發現了一些資源,建議在渲染另一個主體視圖之前顯式刪除主幹視圖。主幹內存泄漏:始終在render()之前執行remove()
現在還是這樣嗎?我應該在當前視圖上調用remove(),如果我想導航到另一個路線並呈現另一個視圖?當我在at時,當我做$('body')。html(...) - 'body'中的現有內容會發生什麼時,它會被刪除並被垃圾收集嗎?
這取決於你在做什麼。但作爲一種良好的做法,建議使用視圖中的remove()
方法。
如果您在jQuery中使用Backbone,並且沒有將偵聽器綁定到您的模型/集合,則不需要在渲染前刪除元素。
原來,如果您嘗試使用jQuery替換元素內容,lib將處理子項,數據和關聯事件刪除。 jQuery的文檔說:
當
.html()
用於設置元素的內容時,該元素中的任何內容將被新內容完全替換。另外,在用新內容替換這些元素之前,jQuery會從子元素中移除其他構造,例如數據和事件處理程序。
但如果你綁定您的視圖和模型/集之間的事件,你應該從骨幹做stopListening,或該活動將在你的骨幹分子的事件堆棧,直到您刷新相關的模型/收集相關。
通過執行骨幹視圖remove方法,您將執行jQuery remove()
和Backbone stopListening()
。
現貨。非常感謝,正是我想知道的。有點奇怪,儘管我看到了很多不執行remove()的代碼,儘管視圖中有listenTo。 – Yaro 2014-11-25 00:54:44
這些觀點背後的理論邏輯是,它們是不能被垃圾收集只要有任一對象:
根據您對@GabrielGartz的答案最後的評論:
你之所以會叫jQuery的remove()
是因爲它會刪除對DOM的引用。 Afaik,Backbone使用jquery的on
來收聽與視圖的el
及其子元素(這些事件冒泡)相關的事件。 jquery的remove()
清除這些DOM監聽器。
jQuery的文檔:
類似於.empty()時,卸下襬臂()方法接受元件出 DOM的。使用一個.remove()時,你要刪除的元素本身,以及 因爲它裏面的一切。除了元素本身,所有 結合事件和與該元件相關聯的jQuery數據被去除。 要刪除的要素而不除去的數據和事件,使用.detach() 代替。
的DOM引用是從骨幹查看無關,作爲一個對象會採取一個模型作爲使用listenTo
聽,可以從應用程序的其他部分廣播事件的屬性。
我希望這會有所幫助。
是的,你應該調用'remove',這就是所有視圖的清理應該在哪裏。檢查[jQuery文檔](http://api.jquery.com/html/#html2)以查看$('body')。html(...)將執行什麼操作。 – 2014-11-24 17:31:20