Как получить доступ к динамическому сегменту в контроллере в Ember.js?

У меня есть пример маршрута:

this.route('client', {path: ':id'});

Я могу получить доступ к этому в моем маршруте следующим образом:

model: function(params) {
    console.log(params.id);
}

Как мне получить доступ к :id в моем контроллере?

Ответ 1

Вот как я это делаю в своем приложении. Не уверен, что это лучший подход.

App.IndexRoute = Em.Route.extend({
  model: function(params) {
    this.set('params', params);
  },
  setupController: function(controller, model) {
    controller.set('params', this.get('params'));
    this._super(controller, model);
  }
});

В качестве альтернативы вы также можете выполнить поиск контейнера внутри вашего контроллера. Но я действительно не думаю, что это хороший подход. Вот пример.

this.get('container').lookup('router:main').router.currentHandlerInfos
        .findBy('name','index').params

Ответ 2

Там есть функция сериализации внутри маршрута, с которой вы можете воспользоваться. Здесь для него Документация API. Однако в вашем контексте вы можете просто сделать это:

App.IndexRoute = Em.Route.extend({
  model: function(params) {
    console.log(params.client_id);
  },
  serialize: function(model){
    return { client_id : model.id };
  }
});

Сообщите мне, если это сработает!

Я также заметил ошибку в определении маршрута. Вероятно, это должно быть

this.route('client', {path: '/:client_id'});

или

this.route('client', {path: '/client/:client_id'});

Ответ 3

Я только что наткнулся на этот вопрос, так как мне тоже было интересно, как лучше всего это сделать. Я решил пойти по пути возвращения хеша из модели, а не устанавливать параметры на маршруте.

Итак, в вашем случае я бы сделал следующее:

model() {
  Ember.RSVP.hash({client: <get client>, id: id});
}

И затем в контроллере или шаблоне я могу получить доступ к клиенту, вызвав

model.client

и получить идентификатор, вызывая

model.id

Я лично считаю, что это более чистый способ доступа к id по сравнению с настройкой параметра на маршруте. Конечно, я предполагаю, что идентификатор еще не установлен на модели. В противном случае все это упражнение бессмысленно.

Ответ 4

Если ваш идентификатор является частью вашей модели, вы можете получить ее из самой модели. Например, если у вас есть маршрут с объектом Билл в качестве модели и счета путей /: billId, на вашем контроллере вы можете получить его следующим образом:

this.get( 'модель'). Идентификатор