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

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' });
});
您无法访问setupController钩子中的这些参数.模型挂钩可以访问params对象,因为当您的应用程序通过URL输入时,它才被调用.

你的代码看起来很好,你真的知道,你想这样做.对你有什么好感觉?当看这个代码时,我问自己为什么你没有把你的路由逻辑分解成一个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({
...
});

这应该使您能够从Route中删除parentProjectId属性.

代码日志版权声明:
翻译自:http://stackoverflow.com/questions/15512054/whats-the-proper-way-to-access-parameters-from-within-ember-route-setupcontrol

转载注明原文:ember.js – 从Ember.Route中访问参数的正确方法是什么? setupController?