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



作为应用程序工作流程的一部分,我遇到了冲突情况:我的代码的一部分试图找到尚未加载的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 版本中所有关系的默认设置)时,您将始终获得PromiseObjectPromiseArray

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

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;
  }
});

由于应用程序保留在加载路线中,直到承诺解决,因此它工作顺利。

最新更新