2016-06-13 5 views
1

私のアプリケーションのワークフローの一部として、私のコードの一部が具体的なObjecthasManyリレーションロードされていないので、それはundefinedを返しています。EmberJSがまだロードされていないときにhasManyリレーションのオブジェクトを検査する

私は、すべての約束の特質を世話していたという希望で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

非同期リレーションシップ(現在のemberバージョンのすべてのリレーションシップでデフォルト)を使用すると、常にPromiseObjectまたはPromiseArrayが得られます。

計算されたプロパティの場合は、更新をトリガするため、直接使用することができます。だから、これは安全なコードです:

questions: Ember.computed('[email protected]', { 
    get() { 
    return get(this, 'report.charts').findBy('questionId', get(this, 'questionId')); 
    } 
}) 

あなたが他の文脈でこれを行う場合は、約束を待つ必要があります!だから、任意のフック、アクションなどに:

get(this, 'report.charts').then(charts => { 
    let found = charts.findBy('questionId', questionId); 
    ... 
}) 
+1

私の提案する解決策が私の実際のシナリオに適しているとしても、私はこの答えがよりグローバルに役立つと思います。 – fguillen

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

約束が解決されるまで、アプリケーションはロードルートに残っているためそれはスムージーに動作します。

+0

あなたは[約束の仕事](http://promisesaplus.com)の方法をチェックしてください。 – Lux

関連する問題