BackboneJs中多个路由器与单个路由器的比较

45

我看到的所有关于Backbone的示例都使用一个路由器来处理整个应用程序,但是对于您应用程序的每个单独部分(头部、页脚、舞台、侧边栏),拥有一个路由器难道不是更合理的吗?是否有人构建过使用超过一个路由器的应用程序,你们的经验是什么?

让我们考虑一个具有嵌套视图的复杂应用程序:当一个视图拥有自己的路由器来处理子视图的显示,而不是拥有一个大型的路由器来通知主视图更改其子视图时,这难道不是更好的选择吗?

这个问题的背景是:我看到了Backbone中路由器和GWT中ActivityMapper之间很多相似之处。ActivityMapper只负责获取给定路由和给定DOM容器的正确Presenter。


5
Router对象的整个目的是将一组视图与给定URL相关联,特别是哈希后面的部分。它旨在作为可外部导航(和可书签化)的目标。为什么会有多个路由器是有意义的?你能否更清楚地解释一下自己想要实现的内容? - Elf Sternberg
1
我已经具体化了我的问题,希望如此。 - Andreas Köberle
很棒的问题,Andreas。随着应用程序的增长,更多人肯定会尝试做这件事。 - Adam Fraser
3个回答

23

我正在编写一个应用程序,其中包含多个路由器。

但它不是你想的那种,更像基于模块的设计,而不是每个视图都有一个路由器。

例如,假设我的应用程序有两个大模块,一个处理所有书籍,另一个处理用户。每个模块都有自己的路由器,代表其自己的一组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获得了更多信息,我知道默认情况下无法让多个路由器匹配同一条路线。除非使用类似覆盖backbone history或在路由和正则表达式中使用命名空间来匹配这些路线的解决方法。 更多信息请参见:multiple matching routes 感谢Elf Sternberg提供的链接。


你可以阅读 Backbone 的源代码来找到答案。但是这里有一个提示:https://dev59.com/gm435IYBdhLWcg3wxDFp - Elf Sternberg
好的,所以在默认的backbone框架中,如果没有某种解决方法,就不可能有多个匹配路由。知道了,谢谢你提供的链接。 - Sander

22
我刚刚写了一篇关于Backbone模块特定子路由的博客文章,它允许定义一个“子路由”,并关注那个路由前缀之后的所有内容。
请查看博客条目以获取更多解释:http://www.geekdave.com/?p=13 这意味着您不必反复冗余地定义相同的前缀,您还可以在访问模块时惰性加载子路由。欢迎提供反馈!

SubRoute扩展非常棒! - aleha_84
2
你的回答缺乏足够的信息而没有提供外部链接,这使得它不够完整,即使你的博客文章质量很高也无法解决问题。你应该真正包括一个片段和更多的解释来优化你的回答并服务于长远。非常感谢你抽出时间来帮助。 - Emile Bergeron

2

有一种有限但重要的情况可以使用多个路由器,即根据运行时收集的数据(例如登录凭据-例如管理员与员工可以看到和导航不同的视图集)仅公开应用程序路由和视图的子集。在这种情况下,您可以只实例化适当的Router和View类。这很重要,因为路由可以被标记并发送给用户。当然,您仍然需要在服务器上进行检查,以确保未经授权的用户在通过已授权用户发送的书签到达的视图后没有发出请求。但最好设计应用程序,使未经授权的视图不会生成。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接