2014-01-17 100 views
1

我编码的应用越来越大,到目前为止,我一直只使用一台路由器。我想把它分成两个独立的路由器(对于初学者来说,当然更推出)是这样的:多个Backbone.Routers和默认路由 - 匹配路由的顺序/加载路由器

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路由触发每一次我尝试访问公司路线之一的时间。我猜这是因为应用程序路由器被加载并初始化(我正在使用rails资产管道)。

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

BTW。我们正在使用Backbone.Marionette,因此解决方案可能会使用工具和代码。

+0

正如我从源代码http://backbonejs.org/docs/backbone.html看到的,路由被检查按顺序他们a重新初始化,所以尝试加载并初始化App路由器 –

回答

0

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

我的代码,用木偶初始化:

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 

我仍然不知道这是最佳的解决方案,你必须始终记得到另一行添加到这个初始化为每个新路由器。

0

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

所以,这里以保证路由的一种替代方式,通过特异性的排序:

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

(基本上,它存储的路线在一个数组,然后用*之上对其进行排序,然后:其次通过明确的路线,如users/new。如果一个路线有两个:个字符,它将包含在只有一个路由之前