Nud*_*oll 17 ember.js ember-data ember-router
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);
}
});
Run Code Online (Sandbox Code Playgroud)
也许我是偏执狂,这只是感觉hacky.如果路由是为了访问参数,那么它已经params附加了一个属性.有没有更好的办法?
编辑:我对上面的代码做了一些更新.此外,我的路线看起来像这样:
App.Router.map(function() {
this.resource('project', { path: '/project/:project_id' });
this.resource('task', { path: 'project/:project_id/task/:task_id' });
});
Run Code Online (Sandbox Code Playgroud)
mav*_*ein 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' });
});
});
Run Code Online (Sandbox Code Playgroud)
由于TaskRoute是嵌套的,因此您必须将其重命名为ProjectTaskRoute:
App.ProjectTaskRoute = Ember.Route.extend({
...
});
Run Code Online (Sandbox Code Playgroud)
这应该可以让您parentProjectId property从路线中删除.