Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to render a Meteor Template from Collection of Template names?

Tags:

meteor

I have three simple Templates in Meteor, and a Collection on the server with any combination of their names. I want to be able to render these templates dynamically based on which of their names are in the Collection.

Currently I am trying to accomplish this by using the client to subscribe to the Collection, and access the names through a template function. Unfortunately, if I try to run ">" on the names, Meteor attempts to render the variable name instead of the Template pointed to by its value.

So instead of rendering the html in template1, template2, and template3, the output is merely their names on the page: "template1 template2 template3".

Here is the code I've been using, I hope there's a way to solve my issue without having to run Meteor.render manually.

Server js:

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

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

Client 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>
like image 324
J Yang Avatar asked Nov 23 '12 23:11

J Yang


1 Answers

You can make a render helper:

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

And use it with

{{render templateName}}
like image 114
Tom Coleman Avatar answered Oct 14 '22 11:10

Tom Coleman