2013-01-22 59 views
6

我試圖找出以下情形:Backbone.js:嵌套視圖的路由

可以說我有兩個視圖:一個用於查看項目,另一個用於購買它們。問題在於購買視圖是用於查看的子視圖。

對於路由我有:

var MyRouter = Backbone.Router.extend({ 
    routes: { 
    'item/:id': 'viewRoute', 
    'item/:id/buy': 'buyRoute' 
    } 
}); 

var router = new MyRouter; 

router.on("route:viewRoute", function() { 
    // initialize main view 
    App.mainview = new ViewItemView(); 

}); 

router.on("route:buyRoute", function() { 
    // initialize sub view 
    App.subview = new BuyItemView(); 
}); 

現在,如果用戶刷新頁面,並buyRoute被觸發,但現在沒有主視圖。什麼是解決這個問題的最佳解決方案?

回答

0

我認爲你現在遇到的問題是你不想在BuyView裏面的ViewItem中顯示一些東西?如果是的話,那麼你應該將BuyView和ViewItem的共同點模塊化到另一個View中,然後在這兩個路由上初始化它。

這裏是我的應用

https://github.com/QuynhNguyen/Team-Collaboration/blob/master/app/scripts/routes/app-router.coffee

正如你所看到的一個代碼示例,我模塊化側欄,因爲它可以在多個視圖之間共享。我這樣做是爲了可以重複使用,不會造成任何衝突。

0

您可以檢查主視圖的存在,並創建/打開它,如果它不存在。

我通常在啓動應用程序時創建(但不打開)我應用程序的主要視圖,然後打開/關閉某種視圖管理器。對於小型項目,我只是將我的視圖附加到我的應用程序對象的views屬性中,以便它們都在同一位置,可以作爲views.mainView,views.anotherView等訪問。

我還將Backbone.View與有兩種方法:openclose,它們不僅將視圖附加到/從DOM中刪除,還在視圖上設置了isOpen標誌。

有了這個,你可以檢查,看是否有需要的視圖已經打開,那麼如果不打開它,像這樣:

if (!app.views.mainView.isOpen) { 
    // 
} 

可選除了將建立在你的應用程序稱爲clearViews的方法清除任何打開的視圖,可能除了作爲clearViews參數傳入的視圖名稱之外。因此,如果您有一個不想在某些路線上清除的導航欄視圖,則可以致電app.clearViews('topNav'),除view.topNav之外的所有視圖都會關閉。

退房這個要點的代碼,這一切:https://gist.github.com/4597606

+0

中的CoffeeScript上面的代碼,如果你喜歡:https://gist.github.com/4597528 – georgedyer