Шаблоны рендеринга метеоров с функциями

У меня есть игра, и я хочу систему, которая отображает шаблон, если у них остались приключения.

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, но он не загружается.


person Alex Hong    schedule 06.03.2015    source источник
comment
вы используете автопубликацию? мое первое предположение заключается в том, что (если вы этого не сделаете) вы не публикуете/подписываетесь на все данные текущего пользователя. Всегда ли он отображает шаблон noadventures? Вы настроили маршруты с помощью ironrouter? Если да, то как они выглядят?   -  person Ramsay Lanier    schedule 06.03.2015
comment
Я не хочу, чтобы эти шаблоны были доступны по URL-адресу. Есть ли способ, чтобы js просто отображал шаблон в html?   -  person Alex Hong    schedule 06.03.2015


Ответы (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);
    }
  },      
})

Вы можете сделать больше с этим — документация довольно хороша.

person Ramsay Lanier    schedule 06.03.2015

Некоторая предыстория: одним из принципов 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}}
person Sander van den Akker    schedule 07.03.2015