作为我的应用程序工作流程的一部分,我遇到了冲突情况:我的代码的一部分是尝试在Object
关系中找到一个仍未加载的特定hasMany
,因此它正在返回undefined
。
我正在使用Ember.Array.findBy method,希望它能够照顾所有的承诺'特质。
这是失败的行:
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>"
处理这种情况的方法是什么?
答案 0 :(得分:2)
当您使用异步关系(这是当前ember版本中所有关系的默认关系)时,您将始终获得 PromiseObject
或 PromiseArray
。
如果您在计算属性中,则可以直接使用它,因为它将触发更新。所以这是安全的代码:
&#xA;&#xA; 问题:Ember.computed('report.charts。@ each.questionId',{&#xA; get(){ &#xA; return get(this,'report.charts')。findBy('questionId',get(this,'questionId'));&#xA;}&#xA;})&#xA;
&#xA;&#xA; 如果你在任何其他环境中这样做,你应该等待承诺!所以在任何钩子,动作等中:
&#xA;&#xA; get(this,'report.charts')。then(charts =&gt; {&#xA; let found = charts.findBy('questionId',questionId);&#xA; ...&#xA;})&#xA;
&#xA;
答案 1 :(得分:0)
我已设法解决此问题,阻止路由级别的应用程序返回一个仅在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;
}
});
由于应用程序保留在 loading 路由中,因此它可以顺利运行,直到promise解析为止。