I'm using handlebars.js and I want to start precompiling everything, but I can't seem to find a way to precompile the partials. The majority of my templates are actually partials. I tried just treating my them like regular templates, but then calling them as a partial doesn't work.
Is there any way to precompile partials, or, alternatively, call one template from within another template?
I found an even better method: precompile all your partials as templates, then right before you use them in your code, add this line:
Handlebars.partials = Handlebars.templates;
The improvements are 1) it's shorter and 2) it doesn't loose any custom helpers you might pass in when calling the parent template.
As mentioned here on GitHub, there has been a -p
flag added to the Handlebars CLI.
So you can use handlebars my_partial.handlebars -p -f output.js
I am using HandleBars v3.0.3 and I have partial and not partial templates pre-compiled in one file.
This thread is little bit confusing so I am summarizing the working solution.
- Don't use -p operator while pre-compiling.
- Don't register partial template by Handlebars.registerPartial('myPartial', '{{name}}');
- use Nathan's suggestion of mapping partial object to templates object by
Handlebars.partials = Handlebars.templates;
- Refer partial template by name {{> name}}
Still not sure about precompiling partials, but this is how to call one template from within another template with help from this question: Handlebars helper for template composition
// instead of {{> partialName}} use {{partial "templateName"}}
Handlebars.registerHelper('partial', function(templateName,context){
return new Handlebars.SafeString(Handlebars.templates[templateName](this));
});
http://jsfiddle.net/EBt8R/
I managed to get it working by pre compiling all my partials as templates and then adapting Nathans solution
// instead of {{> partialName}} use {{partial "templateName"}}
Handlebars.registerHelper('partial', function (templateName) {
return new Handlebars.SafeString(JST[templateName](this));
});
So for me Handlebars.templates
became JST
when i compiled things, i noticed it in my compiled templates file.