Железный роутер meteorjs waitOn и использование в качестве данных о рендеринге
Я пытаюсь получить возвращенные данные в моем Template.rendered
функция.
Текущий код:
this.route('editCat', {
layoutTemplate : 'layoutCol2Left',
template : 'modCategoriesEdit',
path : '/mod/categories/edit/:_id',
yieldTemplates : _.extend(defaultYieldTemplates, {
'navigationBackend' : {to : 'contentLeft'}
}),
waitOn : function () {
return Meteor.subscribe('oneCat', this.params._id);
},
data : function () {
return Categories.findOne({_id : this.params._id});
}
});
В этом блоке я жду подписки на Collection Document
и вернуть документ как данные.
Теперь я могу использовать возвращенный документ в моем шаблоне следующим образом:
<template name="modCategoriesEdit">
<h1>Edit {{name}}</h1>
</template>
Моя проблема заключается в том, что я должен использовать возвращаемые данные в моей визуализированной функции следующим образом:
Template.modCategoriesEdit.rendered = function () {
console.log(this.data);
}
Но это возвращает "ноль".
Итак, мой вопрос: как можно получить доступ к возвращенным данным в представленной функции?
4 ответа
Решение:
Просто добавьте следующее в ваш метод iron-router route().
action : function () {
if (this.ready()) {
this.render();
}
}
Чем Шаблон будет отображен после того, как все загружено правильно.
Есть 3 решения, если вы хотите подождать, пока данные waitOn будут готовы перед рендерингом:
1- Добавить action
подключиться к каждому маршруту
Router.map(function()
{
this.route('myRoute',
{
action: function()
{
if (this.ready())
this.render();
}
}
}
2- Используйте onBeforeAction
крюк глобально или на каждом маршруте
Пример кода для глобальной ловушки:
Router.onBeforeAction(function(pause)
{
if (!this.ready())
{
pause();
this.render('myLoading');
}
});
myLoading
(или любое другое имя) должен быть шаблоном, который вы где-то определили.
Не забывайте this.render
линии, в противном случае проблема возникнет при выходе из маршрута (в то время как исходная проблема возникает при загрузке маршрута).
3- Используйте встроенный onBeforeAction('loading')
крюк
Router.configure(
{
loadingTemplate: 'myLoading',
});
Router.onBeforeAction('loading');
myLoading
(или любое другое имя) должен быть шаблоном, который вы где-то определили.
С использованием action
крюк для проверки this.ready()
работает, но похоже, что официальный способ сделать это - вызвать следующее:
Router.onBeforeAction("loading");
Ссылка: https://github.com/EventedMind/iron-router/issues/679
Как сказал @Sean, правильное решение - использовать загрузочный шаблон:
Router.onBeforeAction("loading");
Но если вы не хотите этого, как я, я придумал это решение:
Template.xxx.rendered = function() {
var self = this;
this.autorun(function(a) {
var data = Template.currentData(self.view);
if(!data) return;
console.log("has data! do stuff...");
console.dir(data);
//...
});
}
Template.currentData является реактивным, поэтому в первый раз он имеет значение null, а во втором - ваши данные.
Надеюсь, поможет.
- Проверено на Meteor v1.0 с Iron Router v1.0