17

我想要一个 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.

有任何想法吗?

4

4 回答 4

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在转换时不使用隐式。

于 2013-01-13T18:36:31.810 回答
2

在基于 ember 数据的应用程序中,在 Route 上重定向对我不起作用,因为在重定向点未加载数据,但这对我有用......

在角色控制器中,我转换到加载 firstObject 的角色路由。

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,格里

于 2013-07-05T11:16:31.517 回答
1

作为更新,如果您不想重定向,因为您有嵌套路由,您将需要基于预期路由使用条件重定向。

redirect有两个参数传递给它,模型和转换对象。转换具有targetName您可以根据其值有条件地重定向的属性。

redirect: function(model, transition){
  if(transition.targetName ==='doctors.index'){
    this.transitionTo('doctor', model.get('firstObject'));
  }
}
于 2014-03-21T23:39:37.323 回答
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);
  }
});
于 2015-08-29T14:16:44.753 回答