2013-06-27 103 views
13

我正在將基於Backbone.js和jQuery的單頁Web應用程序遷移到Chrome擴展。然而,無論是pushState,也不是基於hashbang路由器模式似乎與擴展中的環境中發揮出色。我來,我要去只是直接呈現在用戶交互的意見,完全繞過了window.location系統更好的結論。不過,我也不太清楚如何實現這一點沒有在幾十個文件的變化呼叫Router.navigateBackbone.js路由而不更改網址

也可把骨幹路由系統,但旁路網址的任何更改一個可插拔/模塊化的方式?

回答

22

我你真的要堅持用Router.navigate從路由中受益Backbone.js提供的系統,而無需在Chrome擴展中使用散列錯誤(例如,包括斜槓被覆蓋的路由)時,可以讓Router.navigate直接加載url,從而跳過整個pushState體操。

這實際上是很容易做到:

Router = Backbone.Router.extend({ 

    navigate: function (url) { 

    // Override pushstate and load url directly 
    Backbone.history.loadUrl(url); 

    }, 

    // Put routes here 
    routes: { } 

}); 

然後,您可以撥打Router.navigate(url)加載新的路線沒有改變歷史,甚至是綁定的動作包含data-backbone屬性的每一個環節(如<a href="login" data-backbone>Login</a>)與像這樣的事件:

$(function(){ 

    // Initialize router 
    Router = new Router; 
    Backbone.history.start(); 

    // Bind a[data-backbone] to router 
    $(document).on('click', 'a[data-backbone]', function(e){ 
    e.preventDefault(); 

    Router.navigate($(this).attr('href')); 
    }); 

}); 
2

你可以重新定義什麼Router.navigate做,但你最好還是先不完全使用Background.router。我認爲這可能會造成一些混淆,如果您目前正在觸發視圖的歷史記錄更改,那麼您的代碼將會更乾淨。

Backbone.Marionette有一個控制器的概念,它的工作原理與沒有URL映射的路由器很相似(使用Marionette的想法是保持最小的路由定義,而不是調用控制器)。您也不需要使用任何您不想要的Marionette組件。

如果你真的想堅持使用,因爲它是路由器,你很可能只是重新定義Backbone.History.navigate到(注意,未經測試)

navigate: function(fragment, options) { 
    if (!History.started) return false; 
    if (!options || options === true) options = {trigger: options}; 
    fragment = this.getFragment(fragment || ''); 
    if (this.fragment === fragment) return; 
    this.fragment = fragment;  
    if (options.trigger) this.loadUrl(fragment); 
} 
+1

AppRouter是應該用什麼來代替路由器。木偶Controller類現在已經過時 - 任何物體可以作爲使用的控制器通過AppRouter。 – Paul