2011-12-01 13 views
20

從GWT開始,Backbone似乎錯過了關於如何處理視圖生命週期的內置解決方案。在GWT中,每個活動或多或少都等同於主幹中的視圖,由活動管理器管理,該活動管理器在活動上調用onStart/onStop,傳遞eventBus和活動可以呈現的元素。在停止時, ActivityManager將取消綁定活動綁定到事件總線的所有事件,並從DOM中移除視圖。在骨幹中管理視圖的模式

在Backbone中,將事件綁定到模型和集合很容易,但您必須手動刪除它們,並且沒有常見的api方法,您可以在此執行此操作。

所以我正在尋找最佳實踐模式,如何管理視圖,以確保沒有殺死或禁用視圖是不必要的事件。

回答

13

你是對的, 沒有構建解決方案(還)。

但它是當然可以擴充骨幹提供這種功能的, 德里克貝利寫了一篇博客文章中關於這個最近,

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

這絕不聖盃,你可以隨意實現你想要的,但它是一個非常簡單的方法,處理殭屍的意見,現在你仍然需要照顧其他生物在你的記憶中爬行,但這是一個開始與意見至少!

+0

不錯的文章。感謝您的鏈接。 – ProTom

+0

是的文章是朝着正確的方向發展的,但畢竟視圖是負責清理的。我鎖定一個解決方案,視圖不關心清理,導致別人正在做這件事。考慮有時候有人忘記手動清理的大型團隊。你也必須一遍又一遍地寫相同的代碼。 –

+0

這樣的系統並不存在於主幹中,因爲他們想要提供一個結構並且保持靈活性,當然這不是不可能有人想到這一點,並且開始了一個插件,但是我還沒有聽說過一個系統能夠完成所有這自動(還)。 – Sander

5

我使用一個自定義的基本視角,延伸骨幹remove方法:

app.BaseView = Backbone.View.extend({ 

    views: [], // array to keep a ref of child-views for proper disposal later on 

    remove: function() { 

     // dispose any sub-views 
     _.each(this.views || [], function(view) { 
      view.remove(); 
     }); 

     // if the inheriting class defines a custom on-remove method, call it! 
     _.isFunction(this.onRemove) && this.onRemove(); 

     // unbind all events from this view 
     this.off(); 

     // finally, call Backbone's default remove method to 
     // remove the view from the DOM 
     Backbone.View.prototype.remove.call(this); 
    } 
} 

仍然有陷阱:模型和收藏需要手工配置,因爲你如果它使用的不知道做其他觀點也一樣。

2

我發佈我的解決方案來管理視圖https://github.com/thomasdao/Backbone-View-Manager

視圖管理器將始終在創建新視圖之前清除現有視圖。現在,我將初始化一個新的觀點:

newView = VM.createView("newView", function(){ 
      return new View(); 
      }; 

如果我想要重用,而不是創建一個新的視圖,我可以用

newView = VM.reuseView("newView", function() { 
       return new View(); 
      } 

VM.reuseView和VM.createView之間的不同是,如果發現它將返回給你,reuseView將查找名稱爲「newView」的現有視圖。否則,它將執行回調函數和緩存結果。 VM.createView將始終執行回調函數併爲您清理現有的視圖。因此,如果視圖是動態的並且頻繁更改,您可能會喜歡使用VM.createView