2013-12-16 11 views
15

Czy istnieje dobry sposób, aby renderować wynik obietnicy w szablonie kierownicy?Renderowanie rozwiązanej wartości obietnicy w szablonie kierownicy Ember

Na przykład, mam następujący model:

App.TopicItem = DS.Model.extend({ 
    topic: DS.belongsTo('topic'), 
    paddedPosition: function() { 
    return this.get('topic.course.lessons'). 
     then(function(lessons) { 
     return lessons.indexOf(topicItem); 
     }). 
     then(function(index){ 
     var position = index; 

     if (position < 0) { 
      return; 
     } 

     position = position + 1; 

     return (position < 10 ? $.rjust(position, 2, '0') : position.toString()); 
     }); 
    }.property('topic.course.lessons') 
}); 

I chciałbym, aby uczynić wartość pozycji w kierownicy szablon tak:

{{topicItem.paddedPosition}} 

Czy istnieje dobry sposób aby to osiągnąć?

+0

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

+0

Nie jestem pewien, czy czekać na paddedPosition, jak i próbować dowiedzieć się, czy Ember.Handlebars automatycznie rozwiązuje obietnicę. – alvincrespo

Odpowiedz

29

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.

+0

To jest bardzo interesujące i całkowicie sprawdziło się dla mnie. Próbuję jednak zrozumieć - jak to działa? :) – alvincrespo

+0

@valvincrespo Zaktualizowałem odpowiedź z kilkoma dodatkowymi wyjaśnieniami - nadzieja, która ma sens. – rlivsey

+0

Dziękuję bardzo za wyjaśnienia. Zrobiliśmy kilka testów na ten temat i stwierdziliśmy, że istnieje sporadyczny problem z zastosowaniem tego podejścia w kierownicy. Z jakiegoś dziwnego powodu, nawet jeśli obietnica rozwiązuje i ustawia wartość, szablon jest nadal pobierany przez null. – alvincrespo

1

To wydaje się nieoczekiwane zachowanie. Wystąpił błąd związany z tym problemem: https://github.com/emberjs/ember.js/issues/11046

+2

Po dodaniu mojego +1 do tego wydania, zostało zamknięte z wyjaśnieniem, że to nie jest ale, ale funkcja, która jeszcze nie istnieje. Mają plany rozwiązania tego problemu w rdzenia, a zalecenie/prośba o wnoszenie wkładu do RFC. – Joe

Powiązane problemy