我想要使用Backbone Marionette创建一个应用程序。基本上,它的UI结构非常简单。有:
例如,菜单可能会在应用程序的两个部分之间切换,例如“邮件”,“日历”和“联系人”。每个部分都有自己的子导航,子导航视图中显示,每个部分都有一个默认视图。例如,在“邮件”部分中,这可能是“收件箱”视图,在“日历”部分中,这可能是“月份”视图。
因此,一般来说,我们有一个嵌套导航。
如何使用路由器实现此目的?
我的想法是拥有一个应用级路由器,它只为#mail
和#calendar
等部分提供路由。
子导航视图应该有自己的路由器。因此,例如,邮件子导航视图可以有inbox
和sent
的路由器。
最后我希望有一条路由,例如#mail/inbox
,但第一部分应该由顶级路由器处理,第二部分应该由子级路由器处理。
我的问题是我是否能够以子级路由器不需要知道URL前缀(如“mail”)的方式嵌套路由器,并且发生了级联路由。这可能吗?
或者这种做法完全错了吗?
答案 0 :(得分:2)
我不知道Marionette是否有这方面的解决方案,但有一个名为Backbone.subroute的插件,它提供了您正在寻找的功能。
以这种方式分离子路由是一种合法的模式,我之前使用过它。但是,我已经得出结论,在主应用程序路由器中使用每个部分的“主要”路由不是要走的路,因为它将应该共存的问题分开。相反,我开始为路由器实现一个公共基类,它提供了一个“根”URL:
var BaseRouter = Backbone.Router.extend({
//Root path for all routes defined by this router. Override this in a deriving
//class for keeping route table DRY.
urlRoot: undefined,
//override the route method to prefix the route URL
route: function(route, name, callback) {
if(this.urlRoot) {
route = (route === '' ? this.urlRoot : this.urlRoot + "/" + route);
}
//define route
Backbone.Router.prototype.route.call(this, route, name, callback);
//also support URLs with trailing slashes
Backbone.Router.prototype.route.call(this, route + "/", name, callback);
}
});
用法:
var CalendarRouter = BaseRouter.extend({
//all routes will be relative to "calendar"
urlRoot:"calendar",
routes: {
//...
}
}):
当然,对于我的情况,这也是有道理的,因为我在基类中定义了其他常见的路由器任务。为了避免为每个路径输入额外的“日历”前缀,网址并不能保证。
编辑:为了澄清一下,Backbone.SubRoute插件不会强制您在主路由器中定义根路由,您可以像我建议的基类一样使用它。但是如果你想要的只是一个路由前缀,那么基类就是一个更简单,更简单的解决方案。