EmberJS,在仍未加载时检查hasMany关系中的对象

时间:2016-06-13 15:29:26

标签: ember.js promise has-many

作为我的应用程序工作流程的一部分,我遇到了冲突情况:我的代码的一部分是尝试在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>"

处理这种情况的方法是什么?

2 个答案:

答案 0 :(得分:2)

当您使用异步关系(这是当前ember版本中所有关系的默认关系)时,您将始终获得 PromiseObject PromiseArray

&# xA;&#xA;

如果您在计算属性中,则可以直接使用它,因为它将触发更新。所以这是安全的代码:

&#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解析为止。