Create/modify 运行时的 Meteor 模板

Create/modify Meteor templates at runtime

我想知道如何解决这个问题:

我有一个模板,其中包含一些文本和一些模板助手:

<template>Hello {{who}}, the wheather is {{weather}}</template>

现在我需要在运行时动态更改模板的内容,同时保持辅助功能。例如我需要这样:

<template>Oh, the {{weather}}. Good evening {{who}}</template>

文本发生变化,不同位置需要助手。想一想一个应用程序,用户可以在其中创建自定义表单,其中包含某些变量的占位符,例如填写表单的用户的姓名。基本上,模板的内容存储在一个mongo文档中,需要在运行时将其转换为模板,或者需要更改现有模板。

如何解决这个问题?我可以在运行时更改模板的内容吗?

只需让一个助手动态构建整个字符串(记住 this 指的是当前数据上下文):

Template.foo.helpers({
  dynamicString: function(switch){
    if ( switch == 1) return "Hello "+this.who+", the wheather is "+this.weather;
    else return "Oh, the "+this.weather+". Good evening "+this.who;
  }
});

然后在您的模板中:

<template name="foo">
  {{dynamicString}}
</template>

或者,只需使用 {{#if variable}} 或 {{#unless variable}} 块来更改模板中的逻辑。简单多了。

<template name="foo">
  {{#if case1}}
    Hello {{who}}, the wheather is {{weather}}
  {{else}}
    Oh, the {{weather}}. Good evening {{who}}
  {{/if}}
</template>

您始终可以使用模板助手来计算必要的布尔变量(例如 case1)。

要解决此用例,您需要使用两种技术。

首先你需要能够改变模板反应。为此,您可以使用 Template.dynamic。例如:

{{> Template.dynamic template=helperToReturnName [data=data] }} 

看这里:http://docs.meteor.com/#/full/template_dynamic

现在您可以更改模板,您需要能够根据您的数据库内容即时创建新模板。这很重要,但如果您愿意编写代码来创建它们,这是可能的,如下所示:

Template.__define__("postList", (function() {
  var view = this;
  return [
    HTML.Raw("<h1>Post List</h1>\n  "),
    HTML.UL("\n    ", Blaze.Each(function() {
      return Spacebars.call(view.lookup("posts"));
    },
    function() {
      return [ "\n      ", HTML.LI(Blaze.View(function() {
        return Spacebars.mustache(view.lookup("title"));
      })), "\n    " ];
    }), "\n  ")
  ];
}));

该代码片段取自 Meteorhacks 上的 this article,文章本身进行了更详细的介绍。阅读本文后,您将掌握完成任务所需的知识...