#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()
совет!