具有功能的流星渲染模板

Meteor Rendering Templates with Functions

我有一个游戏,我想要一个可以呈现模板的系统,如果他们还有任何冒险经历的话。

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 的模板,但它无法加载..

使用 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);
    }
  },      
})

您可以用它做更多事情 - documentation 非常好。

一些背景信息:Meteor 原则之一是 "data on the wire",这意味着只将最基本的必需品发送到客户端(实际数据),因此您不能在服务器上编译模板并发送它们给客户。当然,从技术上讲这是可能的,并且在某些情况下您需要这样做(例如发送 html 电子邮件时),但通常这是一个坏主意。

在 Meteor 方法中调用 Blaze 渲染函数是行不通的,因为 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}}