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

时间:2013-03-01 19:09:56

标签: ember.js ember-router

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

From Ember Pre1 to Pre4: Multiple dynamic segments per route? Update: What is the allowed syntax for dynamic segments?

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

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

所以我希望能够

{{ linkTo calendar_month year month }}

this.transitionTo('calendarMonth', year, month)

想知道在不使用嵌套资源的情况下这是否可行。我可以使用类似的东西:

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

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

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

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

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

换句话说:

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

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

感谢,

1 个答案:

答案 0 :(得分:17)

由于我是您引用的问题的提问者,我在这里回答。我已经更新了我的问题,这是完全可能的。

你的方法应该有效:

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

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

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;
}

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

{{ linkTo calendar_month year month }}

...相反,您只需使用:

{{ linkTo calendar_month yearAndMonth }}

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

摘要:那么路线到底是什么?

  

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