Ember.Route.model
可以访问params
变量,但Ember.Route.setupController
却不能。这对我来说很麻烦,因为我的路径有多个动态片段,我需要在模板中使用它们。
具体来说,我的路径是这样的:/project/:project_id/task/:task_id
。请注意,一个任务可以属于多个项目,而不仅仅是一个。因此,我们无法仅仅通过查看任务本身来确定我们正在查看哪个项目:我们必须使用URL中找到的项目ID。以下是我目前的做法:
App.TaskRoute = Ember.Route.extend({
// This works just fine:
serialize: function(model) {
return {
task_id: model.get('id'),
project_id: this.modelFor('project').get('id')
};
},
model: function(params) {
this.set('parentProjectId', params.project_id);
return App.Task.find(params.task_id);
},
setupController: function(controller, model) {
var parentProject = this.modelFor('project') ?
this.modelFor('project') :
App.Project.find(this.get('parentProjectId'));
controller.set('parentProject', parentProject);
controller.set('content', model);
}
});
也许我有点多虑,这样做感觉有些取巧。如果该路由应该可以访问参数,那么它应该已经附加了一个
params
属性。是否有更好的方法?编辑:我对上面的代码进行了一些更新。此外,我的路由如下:
App.Router.map(function() {
this.resource('project', { path: '/project/:project_id' });
this.resource('task', { path: 'project/:project_id/task/:task_id' });
});
model
没有被调用,所以parentProjectId
属性没有被设置。在这种情况下,我必须在setupController
中使用var parentProject = this.modelFor('project')
。我确实有一个单独的 ProjectRoute。打开 /project/1 将显示项目的任务。点击任务将打开 /project/1/tasks/1。任务视图需要一个返回到项目的链接,所以我从 URL 中获取项目。 - NudeCanalTroll