5

我正在做的一个项目使用 Handlebars.js 模板系统。它读入内容,并在编译模板时在适当的地方注入内容:

<div class="content">
  <p>lorem ipsum</p>

  {{{ content }}}

</div>

在这种情况下,把手是用一个 JS 对象编译的,该对象的content属性是一个文本字符串或 HTML(因此是三重括号)。

然而,内容值(文本或 HTML)也完全有可能包含把手插值代码:

var contentPassedToHandlebars = {
  content: '<p>{{ foobar }}</p>',
  foobar: 'foo'
};

目前输出<p>{{ foobar }}</p>但我打算得到的是<p>foo</p>.

车把是否具有此嵌套内容的功能,或者是否需要自定义助手?( {{{custom_parse content}}})?

对于这个问题的上下文

这种情况源自构建系统 (metalsmith),该系统将文件作为 markdown 读取,将它们转换为 HTML,将结果附加到对象的content属性file,然后解析将其注入file.content输出的把手模板。所有这一切,我希望有一个解决方案可以将把手或字符串插值放入降价中,这样降价文件就可以访问模板可以访问的相同变量(显然更多的全局值config.json不是与文件对象关联的值正在建设中)。

4

2 回答 2

4

没有内置的方法可以做到这一点。您必须管理自己的预渲染过程或内部助手。

对于解决方案,我最终在正式渲染之前运行了预渲染。虽然代码不是车把而是metalsmith-templates插件的一部分,但这是我使用的解决方案

这大致翻译为:

var contentPassedToHandlebars = {
  content: '<p>{{ foobar }}</p>',
  foobar: 'foo'
};

var x = Handlebars.compile(contentPassedToHandlebars.content)(contentPassedToHandlebars);
contentPassedToHandlebars.content = x;

Handlebars.compile(realTemplateSource)(contentPassedToHandlebars);
于 2014-10-02T18:08:18.680 回答
1

或者使用这个:

现场金属匠

```
index.js
var inPlace = require('metalsmith-in-place')

....
.use(inPlace(true))
.....

现在,如果你写 {{> footer }} 它将完成这项工作。

于 2017-11-17T10:56:32.263 回答