BackboneJs 中的多个路由器与单个路由器
Posted
技术标签:
【中文标题】BackboneJs 中的多个路由器与单个路由器【英文标题】:Multiple routers vs single router in BackboneJs 【发布时间】:2012-01-11 19:56:21 【问题描述】:我见过的关于 Backbone 的所有示例都为整个应用程序使用一个路由器,但是为应用程序的每个部分(页眉、页脚、舞台、侧边栏)都使用一个路由器不是很有意义吗?有没有人使用多个路由器构建应用程序?您的经验是什么?
让我们考虑一个具有嵌套视图的复杂应用程序:如果一个视图有自己的路由器来处理子视图的显示,那会比一个必须通知主视图更改其子视图的大路由器更好吗? ?
这个问题的背景:我看到骨干网中的路由器和 GWT 中的 ActivityMapper 有很多相似之处。 ActivityMapper 只负责在 DOM 中为给定路由和给定容器获取正确的演示者。
【问题讨论】:
Router 对象的重点是将视图集合与给定的 URL 相关联,特别是哈希后的部分。它意味着作为外部可导航(和可收藏)的目标。为什么拥有多个路由器有意义?你能更清楚地解释你想要达到的目标吗? 希望我的问题具体化了。 好问题 Andreas,随着应用程序的发展,这绝对是更多人会尝试做的事情。 【参考方案1】:我编写了一个应用程序(仍在编写),其中包含多个路由器。 但是它不像您想象的那样,它更多地基于模块,而不是每个视图的路由器或类似的东西。
例如, 假设我的应用程序中有两个大模块,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 提供的链接。
【讨论】:
您可以阅读 Backbone 的源代码来查找。但这里有一个提示:***.com/questions/5223251/multiple-matching-routes 好的,所以如果没有特定的解决方法,默认主干框架不可能有多个匹配的路由。很高兴知道,谢谢你的链接【参考方案2】:我刚刚写了一篇关于 Backbone 中的模块特定子路由的博文,它允许定义一个“子路由”,它关注该路由前缀之后的所有内容。
查看博文了解更多解释:http://www.geekdave.com/?p=13
这意味着您不必一遍又一遍地重复定义相同的前缀,并且您还可以在访问模块时延迟加载子路由。欢迎反馈!
【讨论】:
SubRoute 扩展很棒! 您的答案在没有外部链接的情况下无法提供足够的信息,即使您的博客文章质量很高,开箱即用的答案也很差。你真的应该包括一个 sn-p 和一些更多的解释,以便随着时间的推移提供答案。非常感谢您抽出宝贵时间提供帮助。【参考方案3】:当使用多个路由器有意义时,有一个有限但重要的情况。如果您只需要根据运行时收集的数据(可能是登录凭据 - 例如,经理与员工可以在不同的视图集之间查看和导航)公开应用程序的路由和视图的子集,则可以仅实例化适当的路由器和视图类。这很重要,因为可以为路线添加书签并从用户发送到用户。当然,您仍然需要在服务器上进行检查,以确保未经授权的用户在通过授权用户发送的书签导航到他们到达的视图后不会发出请求。但最好将应用程序设计为不会生成未经授权的视图。
【讨论】:
以上是关于BackboneJs 中的多个路由器与单个路由器的主要内容,如果未能解决你的问题,请参考以下文章