一个模型ID来自另一个模型,如何通过余烬设置路由



我的余烬版本:

DEBUG: -------------------------------
Ember             : 2.10.2
Ember Data        : 2.11.0
jQuery            : 2.2.4
Ember Simple Auth : 1.1.0
Model Fragments   : 2.3.2
DEBUG: -------------------------------

还有我的路线代码:

import Ember from 'ember';
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import RSVP from 'rsvp';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
  model() {
    console.log(1);
    return RSVP.hash({
      ...,
      user: this.store.findRecord('user', this.get('session.data.authenticated.id'))
    });
  },
  afterModel(model, transition) {
    return this.store.findRecord('company', model.user.get('companyId')).then(company => {
      console.log(2);
      this.set('company', company);
    });
  },
  setupController(controller, model) {
    console.log(3);
    controller.set('user', model.user);
    controller.set('company', this.get('company'));
  }
});

看看console.log代码,我认为正确的顺序应该是1->2->3。但有时结果是 1->3->2。

但我的company id必须来自user api.那么我在路线中设置它的方式是什么?谢谢。

我正在编写另一个解决方案,来自RSVP.hash api文档

返回一个承诺,

当所有给定的承诺都已实现时,该承诺将得到履行,如果其中任何一个承诺被拒绝,则返回该承诺。返回的承诺使用与 promise 对象参数具有相同键名的哈希来实现。如果对象中的任何值不是承诺,则它们将被简单地复制到已实现的对象。

因此,您可以像下面的代码一样编写您的要求,

model() {
        var promises = {
            user: this.store.findRecord('user', this.get('session.data.authenticated.id'))
        };
        return Ember.RSVP.hash(promises).then(hash => {
            //then method will be called once all given promises are fulfilled, or rejected if any of them become rejected.
            return this.store.findRecord('company', hash.user.get('companyId')).then(company => {
                hash.company = company; // Here i am setting company property inside model itself, so you dont need to set it in route and carry over to controller
                return hash;
            });
        })
    }

注:I我很想知道您是否可以在 Ember-Twiddle 中重现 1->3->2 行为。

实际上,正确的方法是将所有模型提取放在model钩中:

model() {
  return RSVP.hash({
    ...,
    user: this.store.findRecord('user', this.get('session.data.authenticated.id'))
  }).then(hash => {
      hash.company = this.store.findRecord('company', hash.user.get('companyId'));
      return RSVP.hash(hash);
  })
},
setupController(controller, model) {
  controller.set('user', model.user);
  controller.set('company', model.company);
}

相关内容

最新更新