使用 Blaze.render + Blaze.view 或 Blaze.with 以编程方式将变量插入 Meteor 模板

Programmatically insert variables into Meteor Templates with Blaze.render + Blaze.view or Blaze.with

我正在尝试弄清楚如何使用 Blaze API 以编程方式将变量助手插入到模板中。我相信它需要使用某种形式来完成:

Blaze.render(Blaze.with('variable', contentFunction);

但是,我正在努力让 contentFunction 正常工作。我尝试了一个 returns 会话变量的函数:

var session_var = function() {
  return Session.get('myVariable');
};

但是,我不断收到未定义的错误。我知道如果我定义了一个单独的模板来渲染就可以做到这一点,但对于这个特殊情况来说这似乎有点过分了。我想知道是否有人可以解释 Blaze.with 和 Blaze.view 是如何工作的。另外,是否可以通过编程方式将变量助手插入到模板中?

在不知道您想要做什么的情况下,不清楚这是否是最简单的处理方式。

但是,如果您查看 the docs,您会发现您可以在数据上下文中提供会话变量并使用 Blaze.With , 或者不提供数据上下文并使用 Blaze.View 代替(这似乎是你想要的)。

因此,如果您想要呈现反应式数据上下文,则必须在 Blaze.With 的第一个参数中提供它。尝试这样的事情:

var myView = Blaze.With(
  function() {
    return {
      foo: Session.get('foo')
    };
  },
  function() {
    return Spacebars.mustache([
      'the value of foo is ',
      this.lookup('foo')
    ]);
  }
);
Blaze.render(myView, document.body); // or whatever element you want to render it inside

或者,对于 Blaze.View

var myView = Blaze.View(
  function() {
    return 'the value of foo is ' + Session.get('foo');
  }
);
Blaze.render(myView, document.body); 

老实说,了解可呈现内容结构的最简单方法(如果您以编程方式执行此操作,这是困难的一点)是研究 Spacebars 编译器生成的内容。换句话说,找到一个有趣的template/sub-template,它是由准HTML生成的,从中挑选一个元素运行 Blaze.getView([ELEMENT])._render,然后研究结果[=14] =]