在运行时创建/修改Meteor模板

时间:2015-03-04 20:33:35

标签: meteor meteor-blaze

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

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

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

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

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

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

如何处理?我可以在运行时更改模板的内容吗?

2 个答案:

答案 0 :(得分:1)

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

首先,您需要能够更改模板的反应性。为此,您可以使用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,文章本身更详细。阅读完文章后,您将获得完成任务所需的知识......

答案 1 :(得分:0)

只需让助手动态构建整个字符串(记住 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 )。