我想要一个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
。
有什么想法吗?
答案 0 :(得分:24)
你应该可以这样做:
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
。
答案 1 :(得分:2)
在我的基于ember-data的应用程序中重定向路由对我不起作用,因为数据未在重定向时加载,但这对我有用...
在角色控制器中,我转换到第一个加载的对象的角色路由。
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,格里
答案 2 :(得分:1)
作为更新,如果您不想重定向,因为您有嵌套路线,则需要根据预期路线使用条件重定向。
redirect
传递了两个参数,即模型和转换对象。转换具有属性targetName
,您可以根据其值有条件地重定向。
redirect: function(model, transition){
if(transition.targetName ==='doctors.index'){
this.transitionTo('doctor', model.get('firstObject'));
}
}
答案 3 :(得分:1)
对于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);
}
});