2012-11-23 8 views
7

Mam trzy proste szablony w Meteorze i kolekcję na serwerze z dowolną kombinacją ich nazw. Chcę móc dynamicznie renderować szablony w oparciu o ich nazwy w kolekcji.Jak renderować szablon Meteor z kolekcji nazw szablonów?

Obecnie próbuję to osiągnąć, używając klienta do zasubskrybowania kolekcji i dostępu do nazw poprzez funkcję szablonu. Niestety, jeśli spróbuję uruchomić ">" na nazwach, Meteor próbuje renderować nazwę zmiennej zamiast szablonu wskazywanego przez jej wartość.

Więc zamiast renderowania html w template1, Template2 i template3, wyjście jest tylko ich nazwiska na stronie: "template1 Template2 template3".

Oto kod, którego używam, mam nadzieję, że istnieje sposób na rozwiązanie mojego problemu bez konieczności ręcznego uruchamiania Meteor.render

js Server: html

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

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

Klient:

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

Odpowiedz

4

Można dokonać render pomocnika:

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

i używać go z

{{render templateName}} 
+0

+1 świetne rozwiązanie! – Marc

+0

Dokładnie tego szukam, dzięki! –

+0

Problemem jest tu zarządzanie pamięcią, on ponownie generuje szablon, ponieważ wywołuje się funkcję 'Template [nazwa]()'. Ta metoda jest dobra, ale nie należy jej poprawnie usuwać po wymianie. Testuję to, a ty, po włożeniu i usunięciu kilku tysięcy koni, dostajesz 50 MB pamięci! –

0

Można spróbować tej

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

w skrypcie

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

nie mogę się wypowiedzieć (reputacja nie wystarczająco wysokie :() ... ale ...

Znalazłem tę odpowiedź po dłuższym przeszukiwaniu, aby uzyskać odpowiedź na następujące pytanie:

"Jak dynamicznie lub programowo wybrać szablon kierownicy do renderowania w meteorze".

Zasadniczo chcę mieć kolekcję typów rzeczy, powiedzmy "a", "b" i "c", a podczas powtarzania kolekcji takich rzeczy chcę wybrać szablon specyficzny dla danego typu renderować dla każdego ... gdzie szablony mają nazwy "aThingItem", "bThingItem" i "cThingItem".

Moje rozwiązanie opiera się na powyższej odpowiedzi Toma Colemana i musiałem tylko nieznacznie ją poprawić, aby działała w mojej sytuacji. Dziękuję Tomowi za odpowiedź!

Umieszczam tę "odpowiedź" tylko po to, aby (miejmy nadzieję) pomóc innym, którzy próbują szukać odpowiedzi na pytania sformułowane podobnie jak moje.

0

Meteor 1.0 prostu wyszedł dzisiaj, a ja po prostu chcesz zaktualizować ten za 2014 :) Wykorzystanie

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

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

próbki:

{{#each kitten}} 
    {{> Template.dynamic template=kitten_type data=this }} 
{{/each}} 
Powiązane problemy