Шаблоны рендеринга метеоров с функциями
У меня есть игра, и я хочу систему, которая отображает шаблон, если у них остались какие-либо приключения.
Meteor.methods({
adventure: function () {
if(Meteor.user().adv > 0)
{
Meteor.users.update({_id: this.userId}, {$inc: {'adv': -1 }});
this.render('adv');
}
else
{
this.render('noadventures');
}
},
})
У меня есть шаблон с именем adv, но он не загружается..
2 ответа
Используйте Blaze.render или Blaze.renderWithData - вот так:
Meteor.methods({
adventure: function () {
if(Meteor.user().adv > 0)
{
Meteor.users.update({_id: this.userId}, {$inc: {'adv': -1 }});
Blaze.render(Template.adv, $('body').get(0);
}
else
{
Blaze.render(Template.noadventures, $('body').get(0);
}
},
})
Вы можете сделать больше с этим - документация довольно хорошая.
Некоторая справочная информация: один из принципов Meteor - это "данные по проводам", то есть клиенту отправляются только самые важные данные (фактические данные), поэтому вы не можете скомпилировать шаблоны на сервере и отправить их клиенту. Конечно, технически это возможно, и есть сценарии, которые вам нужны (например, при отправке html-писем), но обычно это плохая идея.
Вызов функции рендеринга Blaze внутри метода Meteor не будет работать, потому что Blaze работает на стороне клиента, а ваш метод - на стороне сервера. Вы должны сделать рендеринг в Meteor.call на стороне клиента следующим образом:
Meteor.methods({
adventure: function () {
if(Meteor.user().adv > 0) {
Meteor.users.update({_id: this.userId}, {$inc: {'adv': -1 }});
return true;
}
return false;
}
});
И на стороне клиента:
Meteor.call('adventure', function (error, result) {
if (error) {
// do something
}
else {
if(result)
Blaze.render(Template.adv, $('body').get(0);
else
Blaze.render(Template.noadventures, $('body').get(0);
}
}
Почему вам нужно позвонить Blaze.render? Почему бы вам просто не сделать это в шаблоне, что-то вроде
{{> Template.dynamic template=template}}