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
.
Любые идеи?
Ответы
Ответ 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);
}
});