18

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);
  }
});

也许我是偏执狂,这只是感觉 hacky。如果该路由旨在访问参数,那么它已经params附加了一个属性。有没有更好的办法?

编辑:我对上面的代码做了一些更新。此外,我的路线如下所示:

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

2 回答 2

11

您无权访问 setupController 挂钩中的这些参数。模型钩子可以访问 params 对象,因为它只是在通过 URL 输入您的应用程序时被调用。

你的代码看起来很不错,你真的知道,你想这样做。你对它有什么感觉?查看这段代码时,我问自己为什么不将 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从路由中删除。

于 2013-03-19T22:59:32.067 回答
2

从 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')
    }
});
于 2018-05-17T15:01:08.217 回答