Каков правильный способ доступа к параметрам из Ember.Route. setupController? - программирование
Подтвердить что ты не робот

Каков правильный способ доступа к параметрам из Ember.Route. setupController?

Ember.Route.model имеет доступ к переменной params, но Ember.Route.setupController нет. Для меня это неприятно, потому что мой путь имеет несколько динамических сегментов, и мне нужно использовать их все в моем шаблоне.

В частности, мой путь выглядит следующим образом: /project/:project_id/task/:task_id. Обратите внимание, что задача может принадлежать многим проектам, а не только одному. Поэтому мы не можем сказать, какой проект мы рассматриваем, просто смотрим на задачу: мы должны использовать идентификатор проекта, найденный в URL-адресе. Вот как я это делаю сейчас:

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, прикрепленное к нему. Есть ли лучший способ?

EDIT: я сделал некоторое обновление кода выше. Кроме того, мои маршруты выглядят так:

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

Ответ 1

У вас нет доступа к этим параметрам в hookController. Крючок модели имеет доступ к объекту 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({
...
});

Это позволит вам удалить parentProjectId property из маршрута.