backbone.js - 如何构建 Backbone Marionette 应用程序?

标签 backbone.js marionette

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

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

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

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

如何使用路由器实现此目的?

我的想法是拥有一个应用程序级路由器,只为 #mail#calendar 等部分提供路由。

子导航 View 应该有自己的路由器。因此,例如,邮件子导航 View 可以有一个用于收件箱已发送的路由器。

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

我的问题是我是否可以以一种方式嵌套路由器,使得子级路由器不需要知道“mail”之类的URL前缀,并且发生级联路由。这可能吗?

或者这种方法完全错误吗?

最佳答案

我不知道Marionette是否有解决方案,但有一个名为Backbone.subroute的插件,它提供了您正在寻找的功能。

以这种方式分隔子路由是一种合法的模式,我以前也使用过它。然而,我后来得出的结论是,在主应用程序路由器中保留每个部分的“主”路由并不是正确的方法,因为它分离了应该共存的关注点。相反,我开始为路由器实现一个公共(public)基类,它提供了一个“根”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插件不会强制您在主路由器中定义根路由,您可以按照我建议的基类相同的方式使用它。但如果您想要的只是一个路由前缀,那么基类是一个更轻、更简单的解决方案。

关于backbone.js - 如何构建 Backbone Marionette 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14563590/

相关文章:

javascript - Backbone 在将模型渲染到模板之前扩展模型

jquery - Backbone Marionette - 调用布局扩展时抛出错误

javascript - 主干 - 将 JSON 加载到集合中不会在 View 中呈现

javascript - 为什么 Backbone 中的 checkbox 需要超时才能被选中

javascript - 如何在公共(public)选项卡布局中包装和显示 View ?

marionette - 模块之间的共享集合

marionette - Backbone Marionette 事件聚合器 : how to listen at the App level to ItemView Event

javascript - itemView 触发到达父级的自定义事件

javascript - Backbone 建议在服务器端生成页面时插入所有模型

javascript - Backbone JS单页应用文件上传?