灰烬 - 自动重定向到firstObject

时间:2013-01-13 16:06:37

标签: javascript ember.js ember-router

我想要一个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 个答案:

答案 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);
  }
});