2012-11-23 173 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}}