2014-11-06 88 views
0

tl; dr:當從一個頁面移動到另一個頁面時,僅更改/銷燬需要它的塊(而不是重新呈現整個頁面)。並儘可能簡化應用程序路由器。Backbone中的智能渲染子視圖

我是新來的骨幹,所有的例子開始使用它,我已經看到了關於小應用程序與變化不大,有時(添加/刪除一些內容,單頁,但從來沒有完全重新渲染)。但是,當我開始做我的應用程序,它是一個略微複雜一點,我面對的子視圖組織的問題...

問題:當應用程序的每個頁面包含的子視圖(每個子視圖可以有另一個子視圖,即嵌套子視圖),這是負責在頁面中顯示他們的塊,合理的慾望是不會重新渲染,當你通過網頁瀏覽的是不改變的塊。有時你需要重新呈現整個頁面,當它從以前的,有時只是一些頁面上的塊完全不同。但是在這種情況下,應用程序路由器變成了包含太多邏輯的怪物對象,因此很難維護。

我想要什麼:我想我的路由器要像

define(['jquery', 'backbone'], function ($, Backbone) { 

    return Backbone.Router.extend({ 

     routes: { 
      "": "home", 
      .......... 
     },  

     home: function() { 
      require(['views/home'], function (View) { 
       var view = new View({ el: $("body") }); 
       view.render(); 
      }); 
     }, 

     .......... 

    }); 
}); 

所以,我的目標是將邏輯渲染子視圖的意見。所以,這一觀點將決定該怎麼做:自我呈現,包括子視圖或問子視圖來決定同樣的問題留給自己。

可能的解決辦法:仔細想想我都附帶包含的意見,申請狀態樹(如first_design(家庭(約,登錄)))全局對象的想法。當我們移動到下一頁時,它具有相同的主視圖(即first_design),我們不會呈現first_design視圖,但只是它的子視圖(在這種情況下只有主頁)。對於路由器中的每個頁面,我們現在需要手動定義這個視圖樹。例如像這樣:

define(['jquery', 'backbone'], function ($, Backbone) { 

    return Backbone.Router.extend({ 

     routes: { 
      "": "home", 
      "contacts": "contacts", 
      .......... 
     },  

     home: function() { 
      require(['views/firstDesign', 'views/home', 'views/about', 'views/login'], function (FirstDesign, Home, About, Login) { 
       new FirstDesign({ el: $("body"), subviews: { new Home({ subviews: { new About(), new Login() } }) } }); 
      }); 
     }, 

     contacts: function() { 
      require(['views/firstDesign', 'views/contacts'], function (FirstDesign, Contacts) { 
       new FirstDesign({ el: $("body"), subviews: { new Contacts() } }); 
      }); 
     }, 

     .......... 

    }); 
}); 

所以,問題是...:我相信我是重新發明輪子,現在,顯然我的車輪是不夠好(甚至可能不圓:d)。那麼是否有我需要的任何實現?或者,如果不是,那麼我該如何正確地做到這一點?謝謝!

P.S:我使用Backbone.js的與require.js。對不起我的英語,這不是我的母語......

回答

0

我意識到,我的解決方案是不那麼靈活。畢竟我決定使用木偶。真正幫助我解決我的問題是this question。頁。s:Marionette現在在Region類中有一個hasView方法。