Meteor: функция визуализации, вызываемая до загрузки документов

#meteor #iron-router

#meteor #железный маршрутизатор

Вопрос:

У меня есть шаблон с визуализируемой функцией, подобной этой:

 Template.config.rendered = function () {
    var barfoo = BarFoo.findOne({....});

    if (barfoo) {
        $('[start-date]').datepicker({ ... });
    }
}
  

Проблема в том, что коллекция BarFoo все еще пуста на момент вызова rendered функции.

Я использую Iron Router, поэтому могу подождать, пока определенные подписки загрузят свои документы:

 HomeController = RouteController.extend({
    ...
    waitOn: function () {
        return Meteor.subscribe('barfoo');
    }
});
  

Итак, вопрос в том, как возможно, что визуализированная функция вызывается до загрузки данных barfoo?

Ответ №1:

Вы могли бы использовать onData в вашем routecontroller. Если вы используете data параметр:

 data: function() {
    bar: BarFoo.findOne({....})
}
onData: function() {
    if(BarFoo.findOne({....})) {
        $('[start-date]').datepicker({ ... });
    }
}
  

onData запускается каждый раз, когда изменяется возвращаемое значение data , поэтому вы можете сначала проверить, есть ли там значение, его также можно изменить реактивно, если изменится ваша подписка.

Другой вариант — добавить шаблон загрузки, который отображается при завершении вашей подписки:

 loadingTemplate : 'template'
  

Комментарии:

1. Проблема с этим решением заключается в том, что вы используете определенные шаблоны в своем контроллере. Также, когда я определяю шаблон «загрузка», визуализируемая функция вызывается перед отображением шаблона загрузки. Я нашел другое обходное решение, которое, похоже, работает, которое заключается в определении Deps.autorun(function () { .... }) внутри отображаемой функции

2. @JeanlucaScaljeri вы также можете определить шаблон загрузки для каждого шаблона, я полагаю. onData в любом случае использует Deps.autorun под капотом. просто не забудьте выполнить .stop() для дескриптора, возвращаемого им в вашем обратном вызове с уничтоженным шаблоном, чтобы очистить его при выходе из шаблона

3. было бы интересно загрузить шаблон для каждого шаблона, у вас есть какие-либо идеи, как это сделать (или ссылка)? и большое спасибо за .stop() совет!