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' });
});
答案 0 :(得分:11)
您无法在setupController挂钩中访问这些参数。 模型钩子可以访问params对象,因为只有在通过URL输入您的应用程序时才会调用它。
你的代码看起来很好,你真的知道,你想这样做。对你有什么感觉hacky?在查看此代码时,我问自己为什么不将Route的逻辑拆分为ProjectRoute和从属TaskRoute。这不适合你吗?
更新:对您的更改的回应
在您的情况下,嵌套资源可能是成功的关键:
App.Router.map(function() {
this.resource('project', { path: '/project/:project_id' }, function(){
this.resource('task', { path: '/task/:task_id' });
});
});
由于TaskRoute是嵌套的,你不必将它重命名为ProjectTaskRoute:
App.ProjectTaskRoute = Ember.Route.extend({
...
});
这可以让您从路线中删除parentProjectId property
。
答案 1 :(得分:1)
自Ember 1.8起,Route类具有paramsFor函数:
import Route from '@ember/routing/route';
export default Route.extend({
setupController(controller) {
this._super(...arguments);
const params = this.paramsFor('name.of.your.route')
}
});