我不知道 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: {
//...
}
}):
当然,就我而言,这也是有道理的,因为我在基类中定义了其他常见的路由器任务。只是为了避免为每个路由 url 键入额外的“日历”前缀并不能真正保证它。
编辑:澄清一下,Backbone.SubRoute 插件不会强迫您在主路由器中定义根路由,您可以像我建议的基类一样使用它。但是如果你想要的只是一个路由前缀,那么基类是一个更轻、更简单的解决方案。