2

我有一个要使用 Backbone Marionette 创建的应用程序。基本上,它的 UI 结构非常简单。有:

  • 两个顶级区域,一个用于菜单,另一个用于内容
  • 菜单区域显示菜单视图
  • 内容区域显示两个相邻的视图
    • 左边是子导航
    • 正确的是实际内容

例如,菜单可能会在应用程序的两个部分之间切换,例如“邮件”、“日历”和“联系人”。这些部分中的每一个都有自己的子导航,应显示在子导航视图中,并且每个部分都有一个默认视图。例如,在“邮件”部分,这可能是“收件箱”视图,在“日历”部分,这可能是“月”视图。

所以,一般来说,我们有一个嵌套导航。

如何使用路由器实现这一点?

我的想法是有一个应用级路由器,它只为部分提供路由,例如#mail#calendar.

子导航视图应该有自己的路由器。因此,例如,邮件子导航视图可以有一个用于inbox和的路由器sent

最后我想要一个路由#mail/inbox,但是第一部分应该由顶级路由器处理,第二部分应该由下级路由器处理。

我的问题是我是否可以以子级路由器不需要知道“邮件”等URL前缀的方式嵌套路由器,并且发生级联路由。这可能吗?

还是这种方法完全错误?

4

1 回答 1

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: {
        //...
    }
}): 

当然,就我而言,这也是有道理的,因为我在基类中定义了其他常见的路由器任务。只是为了避免为每个路由 url 键入额外的“日历”前缀并不能真正保证它。

编辑:澄清一下,Backbone.SubRoute 插件不会强迫您在主路由器中定义根路由,您可以像我建议的基类一样使用它。但是如果你想要的只是一个路由前缀,那么基类是一个更轻、更简单的解决方案。

于 2013-01-28T14:09:01.410 回答