多个Backbone.Routers和默认路由 - 匹配路由/加载路由器的顺序

时间:2014-01-17 13:54:35

标签: javascript backbone.js url-routing marionette

我正在编码的应用程序越来越大,到目前为止,我一直只使用一个路由器。我想将它拆分成两个独立的路由器(对于初学者,当然还有更多的路由器),如下所示:

class window.UFO.Routers.App extends Backbone.Router
  routes:
    #root
    ''                         : 'root'
    #not found
    '*notFound'                : 'notFound'

class window.UFO.Routers.Companies extends Backbone.Router
  routes:
    'companies/new/:angellist' : 'companiesNew'
    'companies/new'            : 'companiesNew'
    'companies/:id/edit'       : 'companiesEdit'
    'companies/:id/edit/people': 'companiesPeople'
    'companies/:id/edit/people/:preselect': 'companiesPeople'

但是存在一个问题:每当我尝试访问公司路线之一时触发notFound路线。我猜这是因为App路由器首先被加载并启动(我正在使用rails资产管道)。

您知道此问题的解决方法吗?也许是一种强制Backbone在匹配* notFound路由之前检查所有可用路由器的方法?

顺便说一句。我们使用的是Backbone.Marionette,所以解决方案可能会使用它的工具和代码。

2 个答案:

答案 0 :(得分:0)

Vlad Niktin的评论引导我走向正确的方向。但是,实际的URL匹配顺序与路由器初始化顺序相反。因此,为了确保'* notFound'路由最后匹配,您必须首先加载App路由器。

我的代码,使用Marionette初始值设定项:

window.APP.addInitializer ->

  appRouter = new window.APP.Routers.App

  companiesRouter = new window.APP.Routers.Companies
  sessionsRouter = new window.APP.Routers.Sessions
  roundsRouter = new window.APP.Routers.Rounds

我仍然不确定这是否是最佳解决方案,因为您总是要记住为每个新路由器添加另一行到此初始化程序。

答案 1 :(得分:0)

我喜欢在与我的控制器相同的文件中声明路由,而我喜欢必须明确命令我的控制器文件包含。

所以,这是另一种确保路线按特异性排序的方法:

https://gist.github.com/chrisdavies/b56d1011cd9ca9394d86

(基本上,它将路由存储在一个数组中,然后在*上排序,然后是:,后跟显式路由,如users/new。如果路由有两个{{} 1}}个字符,它将包含在只有一个的路由之前。