我的余烬版本:
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);
}