2012-11-23 211 views
7

我在流星中有三个简单模板,服务器上有一个集合,它们的名字组合。我希望能够根据它们的名称在Collection中动态呈现这些模板。如何从模板名称集合渲染流星模板?

目前我正试图通过使用客户端来订阅集合,并通过模板函数来访问名称。不幸的是,如果我尝试在名称上运行“>”,Meteor会尝试渲染变量名称而不是其值。

因此,而不是渲染HTML中模板1模板2template3,输出仅仅是他们的页面上的名字:“模板1模板2 template3”。

这是我一直在使用的代码,我希望有一种方法可以解决我的问题,而无需手动运行Meteor.render。

服务器JS:

TemplatesToRender = new Meteor.Collection("templatesToRender"); 

TemplatesToRender.insert({templateName: "template3"}); 
TemplatesToRender.insert({templateName: "template2"}); 

客户端HTML:

<body> 
    {{#each templatesToRender}} 
     {{> templateName}}   // meteor trying to render a template 
            // called "templateName" instead of the 
            // variable inside templateName. 
    {{/each}} 
</body> 

<template name="template1"> 
    <span>Template 1</span> 
</template> 

<template name="template2"> 
    <span>Template 2</span> 
</template> 

<template name="template3"> 
    <span>Template 3</span> 
</template> 

回答

4

,您可以拨打render帮手:

Handlebars.registerHelper('render', function(name, options) { 
    if (Template[name]) 
    return new Handlebars.SafeString(Template[name]()); 
}); 

而且随着

{{render templateName}} 
+0

+1伟大的解决方案! – Marc

+0

这就是我正在寻找的,谢谢! –

+0

这里的问题是内存管理,他重复生成模板,因为你调用了'Template [name]()'函数。这种方法很好,但在更换时不要正确移除模板。我测试这个,并且在插入和移除几千个fiv之后,您将获得50 mb的内存堆叠! –

0

你可能想试试这个

在HTML

<body> 

    {{> templateToRender}} 

</body> 

<template name="templateToRender"> 

    {{! use below to detect which template to render}} 

    {{#if templateName "template1"}} 
     {{> template1}} 
    {{/if}} 

    {{#if templateName "template2"}} 
     {{> template3}} 
    {{/if}} 

    {{#if templateName "template3"}} 
     {{> template3}} 
    {{/if}} 

</template 

<template name="template1"> 

    <p>this is template1</p> 

</template> 

<template name="template2"> 

    <p>this is template2</p> 

</template> 

<template name="template3"> 

    <p>this is template3</p> 

</template> 

在脚本

Template.templateToRender.templateName = (which) -> 
    # if user have a field like templateName you can do things like 
    tmplName = Meteor.user().templateName 
    # Session.equals will cause a template render if condition is true. 
    Session.equals which, tmplName 
0

使用它,我不能发表评论(信誉不够高:()...但是...

我发现这个答案后搜索了很长一段时间回答以下问题:

“如何动态或以编程方式选择要在流星中呈现的车把模板”。

基本上,我想要一个Thing类型的集合,比如说“a”,“b”和“c”,并且在迭代这些事情的集合时,我想选择一个类型特定的模板为每个模板渲染...模板被命名为“aThingItem”,“bThingItem”和“cThingItem”。

我的解决方案是基于汤姆科尔曼的回答上面给出的,我只需要稍微调整它,使其适用于我的情况。谢谢汤姆的回答!

我把这个“答案”放在这里只是希望帮助其他人试图寻找类似于我的问题的答案。

0

流星1。0今天刚出来的时候,我只是想更新这个于2014年:)

https://docs.meteor.com/#/full/template_dynamic

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

用法示例:

{{#each kitten}} 
    {{> Template.dynamic template=kitten_type data=this }} 
{{/each}}