我的余烬版本:
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
。那么我在路线上设置的方式是什么?感谢。
答案 0 :(得分:2)
我正在编写另一种解决方案,来自RSVP.hash api docs
返回在履行了所有给定承诺时履行的承诺,或者如果其中任何承诺被拒绝则拒绝承诺。使用与promises对象参数具有相同键名的哈希来实现返回的promise。如果对象中的任何值不是promises,它们将被简单地复制到已完成的对象。
所以你可以写下你的要求,如下面的代码,
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;
});
})
}
注意:我很想知道你是否可以在ember-twiddle中重现1-> 3> 2行为。
答案 1 :(得分: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);
}