我正在將基於Backbone.js和jQuery的單頁Web應用程序遷移到Chrome擴展。然而,無論是pushState
,也不是基於hashbang路由器模式似乎與擴展中的環境中發揮出色。我來,我要去只是直接呈現在用戶交互的意見,完全繞過了window.location
系統更好的結論。不過,我也不太清楚如何實現這一點沒有在幾十個文件的變化呼叫Router.navigate
。Backbone.js路由而不更改網址
也可把骨幹路由系統,但旁路網址的任何更改一個可插拔/模塊化的方式?
我正在將基於Backbone.js和jQuery的單頁Web應用程序遷移到Chrome擴展。然而,無論是pushState
,也不是基於hashbang路由器模式似乎與擴展中的環境中發揮出色。我來,我要去只是直接呈現在用戶交互的意見,完全繞過了window.location
系統更好的結論。不過,我也不太清楚如何實現這一點沒有在幾十個文件的變化呼叫Router.navigate
。Backbone.js路由而不更改網址
也可把骨幹路由系統,但旁路網址的任何更改一個可插拔/模塊化的方式?
我你真的要堅持用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'));
});
});
你可以重新定義什麼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);
}
AppRouter是應該用什麼來代替路由器。木偶Controller類現在已經過時 - 任何物體可以作爲使用的控制器通過AppRouter。 – Paul