2013-06-27 31 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