这似乎表明答案是肯定的:
......但我只是想确认一下。
就我而言,作为一个学习练习,我在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'});
});
但我是否认为这是不可能的?我只是想确保我这样做是最干净,最愚蠢的方式。
换句话说:
我理解这个概念“如果您的用户界面是嵌套的,那么您的路由应该嵌套”,但是,如果我的网址是嵌套的,这并不一定意味着我的界面也会嵌套。所以我想知道:如果我的网址是嵌套的,那么构建相应的嵌套模型总是最佳做法吗?
非常感谢任何指导/澄清。
感谢,
答案 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?)。