Если я изменю Session
var и вызову повторную подписку через autosubscribe
, есть ли какой-либо механизм обратного вызова, чтобы дождаться, пока «последние» данные не будут отправлены с сервера? [1]
Если вы посмотрите на эту суть, вы увидите некоторый код, который регистрирует содержимое коллекции с течением времени. по мере изменения подписки. Соответствующий раздел вывода:
at Subscribed; comments are: first post on #1 - second post on #1
at Flushed; comments are: first post on #1 - second post on #1
at Subscription complete; comments are: first post on #1 - second post on #1 - first post on #2 - second post on #2
Таким образом, даже после (а) вызова .subscribe
, (б) вызова Meteor.flush
(в) внутри обратного вызова onReady
для .subscribe
; в коллекции все еще есть устаревшие данные, и только в 3-м случае там есть «правильные» данные.
Я понимаю, что реактивные шаблоны и .observe
в конечном итоге получат правильные данные, и все «установится» в правильное состояние. Но можем ли мы каким-то образом сказать, что мы еще не там?
Например, большинство приложений-примеров метеора (и моих собственных приложений) склонны к небольшим рывкам (аналогично FOUC) при добавлении и удалении данных из подписной коллекции. Если бы мы могли сказать, что подписка «загружается», мы могли бы что-то с этим сделать.
[1] Очевидно, что данные на сервере постоянно меняются, но, как вы увидите по сути, я не могу (без тайм-аута) найти точку, где это хотя бы правильно. Таким образом, мое использование «действительного» в вопросе.
Очень простой и распространенный вариант использования
Возьмите приложение madewith; когда вы впервые загружаете его, кажется, что приложений не зарегистрировано, пока данные не передаются по проводу, и приложения внезапно не появляются.
Причина этого в том, что Meteor.subscribe
был вызван, но данные еще не поступили по сети. Но у шаблона нет простого способа сообщить, что данные ожидают обработки и что он должен показывать «загружающийся» шаблон. В madewith они действительно что-то делают, когда данные загружены, но это обратный вызов, и, таким образом, он выходит за рамки обычного метеоритного способа ведения дел (т. е. реактивного кодирования).
Было бы гораздо лучше (ИМО) написать что-то вроде:
{{unless apps_loaded}}{{> loading}}{{/unless}}
а также
Template.madewith.apps_loaded = function() { return !Apps.isComplete(); }