从Ember.Route中访问参数的正确方法是什么.setupController?

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从路线中删除.