【问题标题】:Print compiled handlebar template (without data filled in)打印编译好的车把模板(不填数据)
【发布时间】:2016-09-09 00:10:55
【问题描述】:

我正在使用把手从部分编译模板。目前,我有以下 javascript:

var handlebars = require('handlebars'),
  fs = require('fs');

var data = {
  title: "Print handlebars tempalte",
  author: "Internet",
  body: "Hi, I am the body"
}

fs.readFile('partial.html', 'utf-8', function(error, source) {
  handlebars.registerPartial('example_partial', source);
});

fs.readFile('ignore-keywords.html', 'utf-8', function(error, source) {
  var template = handlebars.compile(source);
  var html = template(data);
  console.log(html)
});

部分如下

<div>
  <p>
    Hi, I am a partial!
  </p>
</div>

模板是

<div class="header">
    <h1>{{title}}</h1>
</div>
<div class="body">
    <p>{{body}}</p>
</div>
<div class="footer">
    <div>
      <p>
        Written by {{author}}
      </p>
    </div>
    {{> example_partial}}
</div>

正如您在脚本中看到的,我可以使用 console.log 打印最终生成的 html。但是,我希望能够在不填写数据的情况下打印最终模板。像这样:

<div class="header">
    <h1>{{title}}</h1>
</div>
<div class="body">
    <p>{{body}}</p>
</div>
<div class="footer">
    <div>
      <p>
        Written by {{author}}
      </p>
    </div>
    <div>
      <p>
        Hi, I am a partial!
      </p>
    </div>
</div> 

我希望能够打印已编译的模板,然后我应该能够将其发送到使用此编译模板的其他来源,用数据填充它,然后生成相应的 HTML。为此,我需要生成上述模板。我将如何实现这一目标?

【问题讨论】:

    标签: javascript templates handlebars.js


    【解决方案1】:

    您不能打印或共享已编译的模板,因为它们是函数。

    当您调用handlebars.compile 时,它会将模板分解为字符串和替换标记,然后在运行时构建一个函数,将字符串与来自传入数据的适当标记连接起来。循环 ({{#each}}) 也变成了真正的 JS 循环。

    不幸的是,无论是简单的 JSON 字符串算法还是更强大的 structured cloning algorithm 都无法序列化函数对象。我不知道有什么可以做的,尽管有些浏览器确实支持.toString 来打印源代码。

    不过,我认为您也许可以解决这个问题。我会尝试替换'ignore-keywords.html' 模板中的{{ 标记,这样它们就不会被车把评估,但排除{{&gt; 标记。对部分模板执行相同的操作,然后调用父模板。它应该评估并包含部分而不替换任何变量。将转义的标记交换回{{,您就有了一个可以正常编译的模板,但已经内联了部分。

    【讨论】:

      【解决方案2】:

      由于 Handlebars 是 JS,您需要将 JS 文件添加到具有全局可访问功能的每个项目/站点/应用程序,这些功能可从静态位置(已知网址)检索您的模板,然后根据功能生成所述模板论据。要么使用 Node.js 之类的东西,要么根据 ajax 请求参数在服务器端构建和返回这些模板。我个人会坚持使用前者,因为它只需要在你想要的任何应用程序中嵌入一个 JS 文件。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-18
        • 1970-01-01
        • 1970-01-01
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多