Подтвердить что ты не робот

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.

Любые идеи?

4b9b3361

Ответ 1

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

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 при переходе.

Ответ 2

Перенаправление маршрута не работает для меня в приложении на основе 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')

});

HTH, gerry

Ответ 3

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

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

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

Ответ 4

Для пользователей 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);
  }
});