资源嵌套是启用多个动态段的唯一方法吗?

dou*_*lea 13 ember.js ember-router

这似乎表明答案是肯定的:

从Ember Pre1到Pre4:每条路线有多个动态段?更新:动态细分的允许语法是什么?

......但我只是想确认一下.

就我而言,作为一个学习练习,我在Ember建立一个日历,每月显示.我需要能够从给定的月份链接到上个月,然后到下个月.

所以我希望能够

{{ linkTo calendar_month year month }}
Run Code Online (Sandbox Code Playgroud)

this.transitionTo('calendarMonth', year, month)
Run Code Online (Sandbox Code Playgroud)

想知道如果不使用嵌套资源这是否可行.我可以使用类似的东西:

App.Router.map(function() {
  this.resource("year", { path: "calendar/:year" }, function() {
    this.resource("calendar_month", { path: "/:month" }, function() {
      this.route('index');
    });
  });
});
Run Code Online (Sandbox Code Playgroud)

...但这涉及从建模角度引入一个可能不需要存在的Year对象,这样我就可以在linkTo中使用它的id

我更愿意设置一个包含两个参数/动态段的路线:

App.Router.map(function() {
  this.route('calendar_month', { path: 'calendar/:year/:month'});
});
Run Code Online (Sandbox Code Playgroud)

但我是否正确,这是不可能的?我只是想确保我这样做是最干净,最愚蠢的方式.

换一种方式:

我理解这个概念"如果您的用户界面是嵌套的,那么您的路由应该嵌套",但是,如果我的网址是嵌套的,这并不一定意味着我的界面也会嵌套.所以我想知道:如果我的网址是嵌套的,那么构建相应的嵌套模型总是最佳做法吗?

任何指导/澄清非常感谢.

谢谢,

mav*_*ein 17

由于我是你提到的问题的提问者,我在这里回答.我已经更新了我的问题,这是完全可能的.

你的方法应该有效:

App.Router.map(function() {
  this.route('calendar_month', { path: 'calendar/:year/:month'});
});
Run Code Online (Sandbox Code Playgroud)

您需要添加的是序列化和模型钩子实现:

serialize: function(context){
    // i assume that you wrap year and month in an Object (maybe App.YearAndMonthObject)
    var ret = {
        year : context.get("year"),
        month : context.get("month")
    };
    return ret;
},
model : function(params){
    //somehow create your object from the params
    var model = App.YearAndMonthObject.create({
        year : params.year,
        month : params.month
    });
    return model;
}
Run Code Online (Sandbox Code Playgroud)

这还需要修改你对linkTo的使用:

{{ linkTo calendar_month year month }}
Run Code Online (Sandbox Code Playgroud)

...而你只会使用:

{{ linkTo calendar_month yearAndMonth }}
Run Code Online (Sandbox Code Playgroud)

我认为这是处理这个问题的一种愚蠢方式.

简介:那么路线到底是什么?

它们用于区分问题.在你的情况下似乎是这样,那年和月是同一个问题(=路线)的一部分.因此,它们应该在一个新的Ember对象中包装在一起,你的路径(CalendarMonthRoute)应该处理这个新对象(可能是YearAndMonthObject或CalendarMonthObject?).