我正在编码的应用程序越来越大,到目前为止,我一直只使用一个路由器。我想将它拆分成两个独立的路由器(对于初学者,当然还有更多的路由器),如下所示:
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,所以解决方案可能会使用它的工具和代码。
答案 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}}个字符,它将包含在只有一个的路由之前。