javascript - 如何深度编译嵌套的 Handlebars 内容?

标签 javascript handlebars.js metalsmith

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

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

  {{{ content }}}

</div>

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

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

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

当前输出 <p>{{ foobar }}</p>但我想要得到的是 <p>foo</p> .

handlebars 是否有用于此嵌套内容的工具或是否需要自定义帮助程序? ( {{{custom_parse content}}} )?

对于这个问题的上下文

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

最佳答案

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

对于解决方案,我最终在正式渲染之前运行了预渲染。虽然代码不是 Handlebars ,而是 metalsmith-templates 插件的一部分,here is the solution I used .

粗略翻译为:

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

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

Handlebars.compile(realTemplateSource)(contentPassedToHandlebars);

关于javascript - 如何深度编译嵌套的 Handlebars 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26163053/

相关文章:

javascript - 无法从 Handlebars 模板访问 metalsmith-collections 'path' key ?

javascript - 无法通过 Postman 的环境变量访问 javascript 对象

javascript - 在执行奇怪的步骤序列之前,拆分器无法工作

arrays - 从 Handlebars Helper 返回对象数组

path - Metalsmith:如何使用 path()?

node.js - 不要将 "Jade include"文件转换为 html 文件

javascript - UnityScript 与 Javascript

javascript - 样式化系统按钮未正确呈现

javascript - 将全局配置变量传递给 handlebars 模板的最佳方法是什么?

javascript - 使用 Jasmine 测试 Marionette View 和 Handlebars 模板