多个路由器与BackboneJs中的单个路由器
所有关于Backbone的例子我已经看到整个应用程序使用一个路由器,但是对于应用程序的每个单独部分(页眉,页脚,舞台,侧边栏)有一个路由器没有意义吗? 有没有人用多个路由器构build应用程序?您有什么经验?
让我们来考虑一个嵌套视图的复杂应用:当一个视图有自己的路由器来处理子视图的显示的时候,有没有比一个大的路由器通知主视图改变子视图更好的方法呢?
这个问题的背景:我已经看到很多骨干路由器和GWT中的ActivityMapper的相似之处。 ActivityMapper只负责为DOM中给定的路线和给定的容器获取正确的演示者。
我写了一个应用程序(仍在写),其中有多个路由器。 然而,它不像你想象的那样,它更基于模块,而不是每个视图的路由器或类似的东西。
比如说,我在我的应用程序中有两个大的模块,1个处理所有的书籍,1个给用户。 书籍有多个视图(如用户),列表视图,详细视图,编辑视图等等…所以每个模块都有自己的路由器,代表自己的一组url:
// 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,我知道默认情况下不可能有多个路由器在相同的路由匹配。 没有像覆盖骨干历史或在路由和正则expression式中使用命名空间来匹配这些路由的解决方法。 更多的信息在这里: 多个匹配的路线感谢精灵斯滕伯格的链接。
我刚刚在Backbone中写了一篇关于Module-Specific Subroutes的博客文章,它允许定义一个“子路由”,它关注那个路由的前缀之后的所有内容。
查看博客条目以获得更多解释: http : //www.geekdave.com/?p=13
这意味着您不必重复地重复定义相同的前缀,并且在访问模块时也可以延迟加载子路由。 反馈是最欢迎的!
使用多个路由器是有意义的,但有一个有限但重要的情况。 如果您只需要基于运行时收集的数据公开您的应用程序的路线和视图的一部分(也许login凭据 – 例如,经理与员工可以看到和浏览不同的视图集之间),您可以实例化只适当的路由器和视图类。 这很重要,因为路由可以被join书签并从用户发送到用户。 当然,您仍然需要在服务器上进行检查,以确保未经授权的用户在通过授权用户发送的书签导航到视图后不会发出请求。 但是最好是devise应用程序,这样未经授权的视图就不会生成。