2012-11-23 13 views
7

Ho tre semplici modelli in Meteor e una raccolta sul server con qualsiasi combinazione dei loro nomi. Voglio essere in grado di renderizzare questi modelli dinamicamente in base a quale dei loro nomi sono nella collezione.Come rendere un modello di meteore dalla raccolta di nomi di modelli?

Attualmente sto cercando di farlo utilizzando il client per iscriversi alla raccolta e accedere ai nomi tramite una funzione di modello. Sfortunatamente, se provo a eseguire ">" sui nomi, Meteor tenta di rendere il nome della variabile al posto del Modello puntato sul suo valore.

Così, invece di rendere il codice HTML in template1, template2, e template3, l'uscita è semplicemente i loro nomi sulla pagina: "template1 template2 template3".

Ecco il codice che ho utilizzato, spero che ci sia un modo per risolvere il mio problema senza dover eseguire Meteor.render manualmente.

JS Server: html

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

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

Cliente:

<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> 

risposta

4

si può fare una render aiutante:

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

e utilizzarlo con

{{render templateName}} 
+0

+1 grande soluzione! – Marc

+0

Questo è esattamente quello che sto cercando, grazie! –

+0

Il problema qui è la gestione della memoria, sta rigenerando il modello più e più volte perché si chiama la funzione 'Template [nome]()'. Questo metodo è bello, ma non rimuovere il modello correttamente quando viene sostituito. Lo controllo, e dopo aver inserito e rimosso alcuni tousand fivs, ottieni 50 mb di memoria accumulata! Aggiornamento –

0

si potrebbe desiderare di provare questo

nel tuo 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> 

nello script

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

non posso commentare (reputazione non abbastanza alto :() ... ma ...

Ho trovato questa risposta dopo aver cercato in giro per un po 'di tempo per una risposta alla seguente domanda:

"Come selezionare dinamicamente o a livello di codice un modello di manubri per il rendering in meteora".

Fondamentalmente, voglio avere una raccolta di tipi di una cosa, diciamo "a", "b" e "c" e, mentre iterando attraverso una raccolta di tali elementi, voglio selezionare un modello specifico per tipo per renderizzare per ognuno ... dove i modelli sono denominati "aThingItem", "bThingItem" e "cThingItem".

La mia soluzione si basa sulla risposta di Tom Coleman di cui sopra e ho solo bisogno di modificarlo leggermente per farlo funzionare per la mia situazione. Grazie Tom per la tua risposta!

Ho messo questa "risposta" qui solo per (si spera) aiutare gli altri che stanno cercando di cercare risposte a domande formulate in modo simile al mio.

0

Meteor 1.0 appena uscito oggi, e voglio solo aggiornare questo per il 2014 :)

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

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

campione Uso:

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