2016-06-13 43 views
1

作爲我的應用程序的工作流程的一部分,我遇到了衝突情況:我的代碼的一部分試圖找到特定的ObjecthasMany關係仍然存在沒有加載,因爲它正在返回undefinedEmberJS,在仍未加載時檢查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

當您使用異步關係(當前版本中所有關係的默認關係)時,您將始終獲得PromiseObjectPromiseArray

如果您處於計算屬性中,則可以直接使用它,因爲它會觸發更新。因此,這是安全的代碼:

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

它的工作原理smoothy由於該應用程序保持在裝載路線,直到承諾解決。

+0

你應該看看[promises work]是如何工作的(http://promisesaplus.com)。 – Lux