如何为handlebars.js预编译部分?

时间:2012-08-17 23:53:26

标签: node.js handlebars.js

我正在使用handlebars.js,我想开始预编译所有内容,但我似乎无法找到预编译部分内容的方法。我的大部分模板实际上都是偏见的。我试着像对待常规模板一样对待我们,但是然后将它们称为部分模板不起作用。

有没有办法预编译部分,或者从另一个模板中调用一个模板?

7 个答案:

答案 0 :(得分:50)

我找到了一个更好的方法:将所有部分预编译为模板,然后在代码中使用它们之前,添加以下行:

Handlebars.partials = Handlebars.templates;

改进是1)它更短,2)它不会丢失你在调用父模板时可能传递的任何自定义助手。

答案 1 :(得分:6)

如上所述here on GitHub,Handlebars CLI中添加了-p标志。

所以你可以使用handlebars my_partial.handlebars -p -f output.js

答案 2 :(得分:5)

我正在使用HandleBars v3.0.3,并且我在一个文件中预编译了部分和非部分模板。

这个帖子有点混乱,所以我总结了工作解决方案。

  • 预编译时不要使用-p运算符。
  • 不要通过Handlebars.registerPartial('myPartial','{{name}}')注册部分模板;
  • 使用Nathan建议将部分对象映射到模板对象 Handlebars.partials = Handlebars.templates;
  • 按名称引用部分模板{{>名称}}

答案 3 :(得分:3)

仍然不确定预编译部分,但这是如何在这个问题的帮助下从另一个模板中调用一个模板: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/

答案 4 :(得分:0)

我设法通过预先编译我的所有部分作为模板然后调整Nathans解决方案来实现它

// instead of {{> partialName}} use {{partial "templateName"}}
Handlebars.registerHelper('partial', function (templateName) {
    return new Handlebars.SafeString(JST[templateName](this));
});

所以对我来说Handlebars.templates在编译时变成了JST,我在编译的模板文件中注意到了它。

答案 5 :(得分:0)

for(let [name, template] of Object.entries(handlebars.partials)) {
    handlebars.partials[name] = handlebars.compile(template);
}

答案 6 :(得分:0)

我建议您代替显式添加部分,而不是替换所有已注册的部分,例如:

Object.entries(Handlebars.templates).forEach(([k, v]) => { if ( k.indexOf('partial') != -1 ) Handlebars.partials[k] = v })

在这种情况下,我们只插入名称中包含“ partial”的预编译模板。这样一来,您既可以将它们存储在partials/子文件夹中,也可以存储在some-partial.hbs

之类的名称中。