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

时间:2013-03-19 22:51:25

标签: 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);
  }
});

也许我是偏执狂,这只是感觉很丑陋。如果路由是为了访问参数,则它已经附加了params属性。还有更好的方法吗?

编辑:我对上面的代码做了一些更新。此外,我的路线看起来像这样:

App.Router.map(function() {
  this.resource('project', { path: '/project/:project_id' });
  this.resource('task', { path: 'project/:project_id/task/:task_id' });
});

2 个答案:

答案 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')
    }
});