31

我正在使用handlebars.js,我想开始预编译所有内容,但我似乎找不到预编译部分的方法。我的大部分模板实际上都是部分模板。我尝试将它们视为常规模板,但随后将它们称为部分模板是行不通的。

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

4

7 回答 7

54

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

Handlebars.partials = Handlebars.templates;

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

于 2012-08-27T19:48:08.143 回答
6

正如GitHub 上提到的,Handlebars CLI 中添加了一个-p标志。

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

于 2013-03-23T16:55:52.323 回答
5

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

于 2012-08-18T01:06:23.557 回答
5

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

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

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

我设法通过将所有部分预编译为模板然后调整 Nathans 解决方案来使其工作

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

所以对我来说,Handlebars.templatesJST我编译东西时,我在编译的模板文件中注意到了它。

于 2014-02-11T23:31:05.377 回答
0
for(let [name, template] of Object.entries(handlebars.partials)) {
    handlebars.partials[name] = handlebars.compile(template);
}
于 2019-04-11T13:43:26.463 回答
0

我建议不要替换所有已注册的部分,而是显式添加部分,可能还会过滤它们,例如:

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

在这种情况下,我们只插入名称中包含“部分”的预编译模板。这将允许您将它们存储在partials/子文件夹中或名称中,例如some-partial.hbs

于 2019-10-01T03:12:00.350 回答