Można mieć właściwość leniwie wyznaczyła sobie, coś takiego:
App.TopicItem = DS.Model.extend({
topic: DS.belongsTo('topic'),
paddedPosition: function(key, value) {
if (arguments.length > 1) {
// > 1 args = this is a `set`
return value;
} else {
// otherwise this is a `get`
var _this = this;
value = null;
this.get('topic.course.lessons').
then(function(lessons) {
// do stuff based on result
var padded = ...;
// when the promise is resolved, set this property with the value
_this.set("paddedPosition", padded);
// if the promise resolves immediately, set `value` so we return
// the calculated value and not null
value = padded;
});
// returns null if the promise doesn't resolve immediately, or
// the calculated value if it's ready
return value;
}
}.property('topic.course.lessons')
});
Kiedy to pierwszy dostępny będzie to kick-off obliczenie, podobnie za każdym razem lekcje zmienić, a następnie będzie ona postawiła sobie jako wynik obliczeń po zakończeniu.
Powoduje to, że obliczona właściwość jest wywoływana zarówno w trybie get, jak i set, można rozróżnić te dwie liczby argumentów - 1 dla get, więcej niż 1 dla zestawu (dawniej 2, teraz otrzymujesz 3 więc najlepszym sposobem na wykrycie jest> 1). Więcej informacji na ten temat: in the docs.
Wszystkie dane zwrócone z wyliczonej właściwości (w get lub zestawie) są buforowane do momentu zmiany właściwości zależnych - w tym przypadku topic.course.lessons
.
W powyższym przykładzie, gdy pojawia się pierwszy get
, rozpoczynamy obliczenia i zwracamy null
. To jest teraz buforowane jako wartość właściwości, jeśli cokolwiek innego wywoła tę właściwość, zanim obietnica zostanie rozwiązana, zwróci ona null
.
Po rozwiązaniu obietnicy dzwonimy pod numer set
w tej samej nieruchomości z wyliczoną wartością. To po prostu wraca w ustawieniu i jest teraz buforowane jako wartość właściwości.
Do zmiany właściwości zależnej (topic.course.lessons
) lub nowej wartości to set
, wówczas wartość z pamięci podręcznej jest zwracana z właściwości.
Wygląda na to, że trzeba poczekać na powrót "paddedPosition", coś w stylu 'topicItem.get ('paddedPosition'). Then (function() {Handlebars.compile() ;}); 'nie jestem pewien co do embera, ale takie jest ogólne podejście :) – roo2
Nie jestem pewien, czy czekać na paddedPosition, jak i próbować dowiedzieć się, czy Ember.Handlebars automatycznie rozwiązuje obietnicę. – alvincrespo