2012-07-13 134 views
6

我很好奇人們是如何處理這種情況的。我有一個應用程序,像「/ categories」這樣的路線顯示一個類別列表。點擊每個類別後,會出現該類別中的產品列表,並將路由更新爲「/ categories/1/products」之類的內容。如果我瀏覽一些,然後單擊後退按鈕,我應該只能呈現上一個類別的產品列表視圖,而無需重新呈現類別視圖。帶子視圖的骨幹路由

但是,我還需要確保在直接導航到「/ categories/2/products」時,會呈現類別列表以及產品列表。

基本上,這意味着路由器必須對返回/轉發歷史記錄導航的反應不同,而不是直接訪問URL。這種問題有沒有共同的解決方案?

回答

5

是的,子節必須在創建父節點後總是被調用,無論它是通過直接url還是通過路由器導航訪問。

我的解決方法是在我的應用程序中總是有一個主視圖,路由器始終調用此主視圖。路由器無法訪問其他視圖。在我的主視圖中,我可以處理創建或不創建父視圖的情況。

例如,檢查路由器如何僅調用的MainView有我有創造,如果需要父視圖的方法命名validateCategories:

var MainView = Backbone.View.extend({ 
    id : 'mainView', 
    categories : null, 

    events : { 
    }, 

    initialize : function(){ 
     _.bindAll(this); 
    }, 

    openSection : function(section){ 
     switch(section){ 
      case 'categories': 
       this.validateCategories(); 
       break; 
      case 'products': 
       this.validateCategories(); 
       this.categories.open(new ProductsView()); 
       break; 
     } 
    }, 
    validateCategories : function(){ 
     if(!this.categories){ 
      //we create the parent view only if not yet created 
      this.categories = new CategoriesView(); 
     } 
    } 
}); 
var mainView = new MainView(); 
var RouterClass = Backbone.Router.extend({ 

    routes : { 
    "categories" : "viewCategories", 
    "categories/:id/:section" : "viewProducts" 
    }, 

    viewCategories : function(path) { 
    mainView.openSection('categories'); 
    }, 

    viewProducts : function(id, section){ 
    mainView.model.set({ 
     productId : id, 
     section : section, 
    }); 
    mainView.openSection('products'); 
    } 
}); 

此外,如果你要從頭開始一個新項目不忘記看看這個擴展,幫助你組織你的Backbone.js項目: https://github.com/derickbailey/backbone.marionette