Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 如何构造主干木偶应用程序?_Backbone.js_Marionette - Fatal编程技术网

Backbone.js 如何构造主干木偶应用程序?

Backbone.js 如何构造主干木偶应用程序?,backbone.js,marionette,Backbone.js,Marionette,我有一个应用程序,我想创建使用骨干木偶。基本上,它的UI结构非常简单。有: 两个顶级区域,一个用于菜单,另一个用于内容 菜单区域显示菜单视图 内容区域显示两个相邻的视图 左一个用于子导航 正确的是针对实际内容 例如,菜单可能在应用程序的两个部分之间切换,例如“邮件”、“日历”和“联系人”。这些部件中的每个部件都有自己的子导航,子导航应显示在子导航视图中,每个部件都有一个默认视图。例如,“邮件”部分可能是“收件箱”视图,“日历”部分可能是“月份”视图 所以,一般来说,我们有一个嵌套的导航

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

  • 两个顶级区域,一个用于菜单,另一个用于内容
  • 菜单区域显示菜单视图
  • 内容区域显示两个相邻的视图
    • 左一个用于子导航
    • 正确的是针对实际内容
例如,菜单可能在应用程序的两个部分之间切换,例如“邮件”、“日历”和“联系人”。这些部件中的每个部件都有自己的子导航,子导航应显示在子导航视图中,每个部件都有一个默认视图。例如,“邮件”部分可能是“收件箱”视图,“日历”部分可能是“月份”视图

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

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

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

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

最后我想要一个路由,比如
#邮件/收件箱
,但是第一部分应该由顶级路由器处理,第二部分应该由次级路由器处理

我的问题是,我是否可以嵌套路由器,使子层路由器不需要知道URL前缀(如“邮件”),并且存在级联路由。这可能吗


或者这种方法完全错了?

我不知道木偶是否有解决方案,但有一个名为的插件,它提供了您想要的功能

以这种方式分离子路由是一种合法的模式,我以前也使用过。然而,我得出的结论是,在主应用程序路由器中拥有每个部分的“主”路由并不是一条可行之路,因为它分离了应该共存的关注点。相反,我已经开始为路由器实现一个公共基类,它提供了一个“根”URL:

用法:

var CalendarRouter = BaseRouter.extend({
    //all routes will be relative to "calendar"
    urlRoot:"calendar",
    routes: {
        //...
    }
}): 
当然,在我的例子中,这也是有意义的,因为我在基类中定义了其他常见的路由器任务。只是为了避免为每个路由url键入额外的“日历”前缀并不能真正保证这一点

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

var CalendarRouter = BaseRouter.extend({
    //all routes will be relative to "calendar"
    urlRoot:"calendar",
    routes: {
        //...
    }
}):