13

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

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

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

就我而言,作为一项学习练习,我正在 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'});
});

但我是否正确,这是不可能的?我只是想确保我以最干净、最简洁的方式来做这件事。

换一种方式:

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

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

谢谢,

4

1 回答 1

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

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

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

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

于 2013-03-02T12:58:32.917 回答