Backbone上的所有示例我都看到在整个应用程序中使用了一个路由器,但是对于应用程序的每个部分(页眉,页脚,舞台,侧边栏)都有一个路由器是没有意义的?有没有人用多个路由器构建应用程序,你有什么经历?
让我们考虑一个具有嵌套视图的复杂应用程序:当一个视图有自己的路由器来处理子视图的显示时,不会有一个大的路由器必须通知更改其子视图的主视图?
这个问题的背景:我看到骨干网中的路由器和GWT中的ActivityMapper有很多相似之处。 ActivityMapper仅负责为DOM中的给定路径和给定容器获取正确的演示者。
答案 0 :(得分:23)
我写了一个应用程序(仍然在写),里面有多个路由器。 但是它不像你想的那样,它更基于模块而不是每个视图的路由器或类似的东西。
例如,说我在我的应用程序中有两个大模块,1个处理所有书籍,1个用户。 书籍有多个视图(用户也是如此),列表视图,详细视图,编辑视图等等... 所以每个模块都有自己的路由器, 它代表了它自己的一组网址:
// user module...
var userRouter = Backbone.Router.extend({
routes: {
"users": "loadUsers",
"users/add": "addUser",
"user/:id": "loadUser",
"user/:id/edit": "editUser"
}
// ... rest dropped to save the trees (you never know if someone prints this out)
});
// book module
var bookRouter = Backbone.Router.extend({
routes: {
"books": "loadBooks",
"books/add": "addBook",
"book/:name": "loadBook",
"book/:name/edit": "editBook"
}
// ... rest dropped to save the trees (you never know if someone prints this out)
});
所以,它不像我的两个路由器竞争相同的路由,它们各自处理自己的一组路由。
修改强> 现在我通过Elf Sternberg获得了更多信息,我知道默认情况下不可能在同一条路线上匹配多个路由器。没有像覆盖骨干历史或在路由和正则表达式中使用命名空间来匹配这些路由的解决方法。 更多信息:multiple matching routes 感谢Elf Sternberg的链接。
答案 1 :(得分:22)
我刚刚写了一篇关于Backbone中特定于模块的子路由的博客帖子,它允许定义一个“子路由”,它注意在该路由前缀之后的所有内容。
查看博客文章以获取更多说明:http://www.geekdave.com/?p=13
这意味着您不必一遍又一遍地冗余地定义相同的前缀,并且您还可以在访问模块时延迟加载子路由。反馈是最受欢迎的!
答案 2 :(得分:2)
当使用多个路由器时,有一个有限但重要的情况。如果您只需要公开应用程序路由的一部分,那么基于在运行时收集的数据的视图(可能是登录凭证 - 例如,经理与员工可以看到并在不同的视图集之间导航)您可以仅实例化适当的路由器和放大器。查看课程。这很重要,因为路线可以加入书签并从用户发送给用户。当然,您仍需要检查服务器,以确保未经授权的用户在导航到他们通过授权用户发送的书签到达的视图后不发出请求。但最好是设计应用程序,以便不会生成未经授权的视图。