我正在将基于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