Ember — автоматическое перенаправление на firstObject

Я бы хотел, чтобы путь Ember /clinic/1 автоматически перенаправлял, чтобы показать первого доктора: /clinic/1/doctor/1.

В каждой клинике много врачей.

К сожалению, если я использую этот код:

var doctor = clinicController.get('content.doctors.firstObject');
router.transitionTo('clinic.doctor.index', doctor);

... это не работает, так как content.doctors.length все еще 0, когда этот код запускается в app_router.js.

Есть идеи?


person Chris Nolet    schedule 13.01.2013    source источник
comment
Какую версию Ember вы используете? Я думаю, что этот код до новой маршрутизации. В любом случае, можно ли сделать jsfiddle или jsbin, показывающий пример?   -  person sly7_7    schedule 13.01.2013


Ответы (4)


Вы должны быть в состоянии сделать это:

App.DoctorsRoute = Ember.Route.extend({
  model: function() {
    return App.Doctor.find();
  },

  redirect: function() {
    var doctor = this.modelFor('doctors').get('firstObject');
    this.transitionToRoute('doctor', doctor);
  }
});

Это будет работать, потому что:

  • Если хук модели возвращает объект, который еще не загружен, остальные хуки не будут работать до тех пор, пока модель не будет полностью загружена.
  • Если хук redirect перейдет на другой маршрут, остальные хуки не будут работать.

Обратите внимание, что начиная с 2426cb9 при переходе можно не указывать неявный .index.

person Yehuda Katz    schedule 13.01.2013
comment
Это все еще должно работать с ember 1.0.0rc2? Я всегда получаю this.modelFor('doctors').get('length') в 0. - person Sébastien Grosjean - ZenCocoon; 19.04.2013
comment
Я пробую этот подход, но, похоже, он не работает при начальной загрузке. Я считаю, что это потому, что данные еще не загружены. Однако, если я уйду и вернусь, это сработает, поскольку в это время данные уже загружены. любой совет @Yahuda? - person Ben; 29.04.2013
comment
Также есть проблема с тем, что данные не загружаются при попытке this.modelFor. Однако при попытке console.log(this.modelFor('categories').get('isLoaded')); Возвращает мне true, но content.length 0. - person polianych; 30.04.2013
comment
Долго ломал голову над этим и никак не мог заставить его работать. У меня были дочерние представления, отображаемые не в том родительском элементе, или проблемы с моей моделью, которая не была загружена. ТЕПЕРЬ я понимаю почему: github.com/emberjs/ember.js/issues/2116 и особенно github.com/emberjs/ember.js/issues/1642 закрыть проблему. Похоже, обходной путь, который я собираюсь попробовать, не будет включать Ember Data, поскольку Ember Data, по-видимому, всегда возвращает обещания. - person ; 01.05.2013
comment
@MattSchweers: Я тоже пару дней стучал головой. Вы нашли обходной путь? - person Paulo Scardine; 13.05.2013
comment
@PauloScardine Хотел бы я сказать, что да, но после того, как я опубликовал этот комментарий, у меня не было возможности вернуться к своему коду. Я наблюдаю за проблемами GitHub, о которых я упоминал, и по этим пунктам не было никакого прогресса, поэтому единственным реальным ответом с моей стороны будет удаление данных Ember и переписывание моей логики представления/маршрутизации, чего еще не произошло. Будет обновлено, если я получу рабочее решение - person ; 15.05.2013
comment
Кроме того, как я могу перенаправить его только тогда, когда маршрут врача не выбран (идентификатор не передается с URL-адреса)? - person wen; 12.06.2013
comment
Так это уже не работает? Когда я пытаюсь это сделать, я получаю сообщение об ошибке в консоли Uncaught TypeError: Cannot call method 'get' of undefined. По какой-то причине this.modelFor('doctors') возвращает значение undefined. Похоже, хук перенаправления вызывается до завершения загрузки модели. - person Ryan; 04.07.2013

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

В контроллере ролей я перехожу к маршруту роли для первого загруженного объекта.

Application.RolesController = Ember.ArrayController.extend({

    selectFirstObject: function () {
        if (this.get('content').get('isLoaded')) {
            var role = this.get('firstObject');
            this.transitionToRoute('role', role);
        }
    }.observes('content.isLoaded')

});

ХТХ, Джерри

person user2553452    schedule 05.07.2013

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

redirect ему передаются два аргумента: модель и объект перехода. Переход имеет свойство targetName, где вы можете условно перенаправить на основе его значения.

redirect: function(model, transition){
  if(transition.targetName ==='doctors.index'){
    this.transitionTo('doctor', model.get('firstObject'));
  }
}
person Kingpin2k    schedule 21.03.2014

Для пользователей EmberCLI вы можете добиться того же, выполнив следующие действия:

//app/routes/clinics/show.js
import Ember from 'ember';

export default Ember.Route.extend({
  redirect: function(model) {
    var firstDoctor = model.get('doctors.firstObject');
    this.transitionTo('doctor', firstDoctor);
  }
});
person Constant Meiring    schedule 29.08.2015