Callback, gdy wszystkie elementy szablonu zakończyły renderowanie w Meteor?
Dostaję kolekcję rekordów i umieszczam je w szablonie, po czym je renderuję{{#each}}
i chcę wyświetlić ikonę ładowania, dopóki nie zostanie wyrenderowany ostatni węzeł DOM.
Moim problemem jest to, że nie znalazłem sposobu na zapytanie o stan / ogień wywołania zwrotnego ostatniego elementu renderowanego jako ostatni węzeł DOM do zaktualizowania / ponownego narysowania.
Wygląda to trochę tak w moim pliku HTML:
<template name="stuff">
{{#each items}}
<div class="coolView">{{cool_stuff}}</div>
{{/each}}
</template>
A w pliku JS po stronie klienta:
// returns all records of Stuff belonging to the currently logged-in user
Template.stuff.items = function () {
Session.set('loading_stuff', true);
return Items.find({owner: Meteor.userId()}, {sort: {created_time: -1}});
};
Template.stuff.rendered = function() {
// every time something new is rendered, there will have been loading of the DOM.
// wait a short while after the last render to clear any loading indication.
Session.set('loading_stuff', true);
Meteor.setTimeout(function() {Session.set('loading_stuff', false);}, 300);
};
Zmienna Sessionloading_stuff
jest pytany w pomocniku kierownicy, zwracając nazwę klasy ładowania (z ikoną ładowarki GIF), jeśli jesttrue
.
Powód, dla którego robię to niezręcznieMeteor.setTimeout
jest ponieważTemplate.rendered
jest nazywanypo każdym pojedynczym przedmiocie który został renderowany w szablonie. Muszę więc ponownie potwierdzić, że wciąż się ładuje, ale daj mu trochę czasu, aby załadować następny lub zakończyć renderowanie wszystkich, z małą przerwą, aż do ustawienialoading_stuff
dofalse
.
Jak niezawodnie odpytywać / oddzwonić na końcu wszystkich aktualizacji DOM (dla konkretnego szablonu lub całej strony) właściwego sposobu Meteoru?
Wielkie dzięki.
EDYTOWAĆ
Rozwiązanie z wykorzystaniemsubscribe()
onReady()
wywołanie zwrotne działa tylko częściowo:
Szablony wydają się być nazywane wielokrotnymi (2-3) razy, zanim renderowanie nawet się rozpocznie, alepo dane wróciły z serwera, na którym opiera się szablon do renderowania. Oznacza to, że jest to „zakończone” ładowanie danych, ale DOM jest nadal renderowany. Będę się bawićMeteor.autorun()
i zobacz, czy mogę znaleźć solidny hak, aby zrobić to poprawnie. Tymczasem myślę, że moje pierwotne pytanie wciąż pozostaje:
Skąd mam wiedzieć, kiedy cały szablon / strona zakończył renderowanie?
EDYCJA KOŃCOWA:
Pod koniec dnia, w oparciu o strukturę DOM, zależy od dewelopera solidnego modelu DOM i dołączenia odpowiednich wywołań zwrotnych jak najlepiej do elementów, które chce sprawdzić. Może się wydawać, że jest to anty-klimatyczny pomysł, ale dla mnie jedynym sposobem na poznanie końcowego elementu szablonu jest wyświetlenie elementu ze specjalnym identyfikatorem na samym końcu szablonu, który sygnalizuje koniec renderowanie i dołączenie.livequery
oddzwonić do niego. Mam nadzieję, że Meteor wprowadzi bardziej zunifikowane i globalne wsparcie do sprawdzania tego stanu w przyszłości.