作为应用程序工作流程的一部分,我遇到了冲突情况:我的代码的一部分试图找到尚未加载的hasMany
关系的特定Object
,因此它返回undefined
。
我正在使用Ember.Array.findBy方法,希望它能照顾到所有承诺的特质。
这是失败的行:
this.get('report.charts').findBy('questionId', questionId);
//-> undefined
很明显,在我调用这一行的那一刻,report.charts
并没有全部加载:
this.get('report.charts').map(function(e){ return e.get('questionId') });
//-> ["Wiese_030", undefined, undefined, undefined, undefined]
更多信息:
this.get('report.charts').toString();
//-> "<DS.PromiseManyArray:ember1209>"
处理这种情况的方法是什么?
当您使用异步关系(这是当前 ember 版本中所有关系的默认设置)时,您将始终获得PromiseObject
或PromiseArray
。
如果您在计算属性中,则可以直接使用它,因为它将触发更新。所以这是安全代码:
questions: Ember.computed('report.charts.@each.questionId', {
get() {
return get(this, 'report.charts').findBy('questionId', get(this, 'questionId'));
}
})
如果你在任何其他情况下这样做,你应该等待承诺!所以在任何钩子、动作等中:
get(this, 'report.charts').then(charts => {
let found = charts.findBy('questionId', questionId);
...
})
我已经设法解决了阻止 Route 级别中的应用程序的问题,返回一个承诺,该承诺仅在 hasMany
集合中的所有元素都已解决时才能解决。
我的路线中有这个:
export default Ember.Route.extend({
model(params) {
return this.store.findRecord('report', params.report_id);
}
});
现在我有这个:
export default Ember.Route.extend({
model(params) {
let reportPromise = this.store.findRecord('report', params.report_id)
let promise = reportPromise.then(report => report.get('charts').then(() => report));
return promise;
}
});
由于应用程序保留在加载路线中,直到承诺解决,因此它工作顺利。