2011-12-12 108 views
3

我保持閱讀有關Backbone.js的殭屍(或內存泄漏)的問題。基本上,當你不再需要它時,你必須解除綁定並從DOM中移除該元素,以確保所有事件都被移除。骨幹視圖DOM元素除去

現在,我有幾個貨櫃單頁的應用程序:

<div id="page1"></div> 
<div id="page2"></div> 

和我underscore.js模板添加到這些佔位符。我有每頁的模型,如:

HomeView = Backbone.View.extend({ 
    el: '#page1' 
)} 

現在,當我在元素上點擊該網頁上我導航到另一個Backbone.js的觀點:

clicked: function(ev){ 
    $(this.el).remove(); // <-- this is the problem 
    $(this.el).unbind(); 
    App.navigate('page/2', true); 
} 

這工作得很好,但是......我除去從DOM元素page1所以當我使用後退按鈕前一頁我的元素消失了,沒有任何的HTML重視。

我可能不明白如何鏈接Backbone.js視圖與DOM ...我應該保持與內存泄漏風險的元素?

謝謝!

+0

> *我一直在閱讀有關Backbone.js的殭屍(或內存泄漏)的問題*有一個鏈接或文章做後盾的時候了? –

+0

你在這裏:http://lostechies.com/derickbailey/2011/09/15/zombies-run-managing-page-transitions-in-backbone-apps/ – Cimm

+1

井德里克確實爲你提供了一個解決方案嗎? 一個視圖管理器或您可能想要調用它。 – Sander

回答

5

正如文章說,(是的,我已經試過了他的方法在我自己的項目)之前,你必須找到一個方法來消除你的視圖的DOM元素和取消綁定事件。 有,但是,2種類型的事件,1)骨幹事件,2)綁定到使用jQuery的DOM元素的事件。

所以不是你的:

$(this.el).remove(); 
$(this.el).unbind(); 

這樣做:

this.remove(); 
this.unbind(); 

現在,您要刪除骨幹事件爲好;並且視圖上的this.remove將調用$(this.el).remove();

但是,那只是如何刪除一個視圖而不會留下殭屍。你應該考慮他的方法來展示一個視圖來使這個過程更加自動化。 這是他的文章。

+0

謝謝桑德。對「視圖管理器」不確定,因爲我沒有在其他地方看到這種解決方案,並認爲可能有內置的方法來解決這個問題。 – Cimm

+1

沒有任何構建方式,因爲如果他們將內置的內容限制爲許多用戶創建應用程序的方式,那麼主幹只會爲您的應用程序提供一些結構,您可以選擇要實現它的方式以及方式,這種自由是關鍵! :)所以現在沒有內置的視圖管理器,而derick的想法不是唯一的想法,並且很可能不是聖盃,這是一個巨大的飛躍:) – Sander

10

關於在頁面中丟失page1元素,因此無法使用HTML填充項目,我做了以下操作。

而不是使用:

this.remove(); 

...這完全刪除元素,然後揣摩如何將它添加回去,我使用jQuery的:

$(this).empty; 

這中清空所有子元素,文本以及數據和事件處理程序。更多信息在:http://api.jquery.com/empty/

其實,我使用所有的以下的,這可能是矯枉過正,但我​​們會看到:

this.undelegateEvents(); 
$(this).empty; 
this.unbind(); 

希望這是很有用的!

1

骨幹開發版本(主),現在公開_removeElement()

remove: function() { 
     this._removeElement(); 
     this.stopListening(); 
     return this; 
    }, 

從文檔和連接到它的所有事件偵聽器中刪除此視圖的元素。暴露於使用替代DOM操作API的子類。

_removeElement: function() { 
     this.$el.remove(); 
    }, 

http://backbonejs.org/docs/backbone.html