2016-06-13 3 views
1

В рамках рабочего процесса моего приложения у меня конфликтная ситуация: одна часть моего кода пытается найти конкретное в отношении hasMany, которое все еще остается не загружен и из-за этого возвращается 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

При использовании отношения async (которое используется по умолчанию для всех отношений в текущих версиях 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