语言指南 - 介绍

优质
小牛编辑
135浏览
2023-12-01

什么是 Handlebars?

Handlebars 是一种简单的 模板语言

它使用模板和输入对象来生成 HTML 或其他文本格式。Handlebars 模板看起来像常规的文本,但是它带有嵌入式的 Handlebars 表达式 。

template
<p>{{firstname}} {{lastname}}</p>

Handlebars 表达式是一个 {{,一些内容,后跟一个 }}。执行模板时,这些表达式会被输入对象中的值所替换。

<p>{{firstname}} {{lastname}}</p>

如果应用于输入对象:

input
{
  firstname: "Yehuda",
  lastname: "Katz"
}

则表达式将被相应的属性替换。结果是:

output
<p>Yehuda Katz</p>

嵌套输入对象

有时,输入对象包含其他对象或数组。例如:

input
{
  person: {
    firstname: "Yehuda",
    lastname: "Katz"
  }
}

在这种情况下,你可以使用点符号来访问嵌套属性:

template
{{person.firstname}} {{person.lastname}}

{{#with person}}
{{firstname}} {{lastname}}
{{/with}}
input
{
  person: {
    firstname: "Yehuda",
    lastname: "Katz"
  }
}

each 助手代码会迭代一个数组,使你可以通过 Handlebars 简单访问每个对象的属性表达式。

template
<ul class="people_list">
  {{#each people}}
    <li>{{this}}</li>
  {{/each}}
</ul>
input
{
  people: [
    "Yehuda Katz",
    "Alan Johnson",
    "Charles Jolley"
  ]
}

{{! This comment will not show up in the output}}
<!-- This comment will show up as HTML-comment -->
{{!-- This comment may contain mustaches like }} --}}

自定义助手

通过调用 Handlebars.registerHelper 方法,你可以从模板中的任何上下文中访问 Handlebars 助手代码。

template
{{firstname}} {{loud lastname}}
preparationScript
Handlebars.registerHelper('loud', function (aString) {
    return aString.toUpperCase()
})

助手代码将当前上下文作为函数的 this 指针接收。

template
{{#each people}}
   {{print_person}}
{{/each}}
preparationScript
Handlebars.registerHelper('print_person', function () {
    return this.firstname + ' ' + this.lastname
})

块助手代码

代码块表达式使你可以自定义这样的助手代码:这个助手代码可以使用与当前上下文不同的上下文来调用模板。这些块助手代码在名称前 以 # 号标识,并且需要一个名称相同的结束模板 /。让我们考虑一个生成 HTML 列表的助手代码:

preparationScript
Handlebars.registerHelper("list", function(items, options) {
  const itemsAsHtml = items.map(item => "<li>" + options.fn(item) + "</li>");
  return "<ul>n" + itemsAsHtml.join("n") + "n</ul>";
});

这个示例创建了一个名为 list 的助手代码来生成我们的 HTML 列表。助手代码接收一个 people 参数和一个 options 参数 。options 包含一个名为 fn 的属性,这个属性使你能够像调用普通的 Handlebars 模板一样调用代码块的上下文。

执行后,模板将渲染:

output
<ul>
<li>Yehuda Katz</li>
<li>Carl Lerche</li>
<li>Alan Johnson</li>
</ul>

块助手代码具有其他功能,例如能够创建 else (例如,由内置的 if 函数使用)

因为调用 options.fn(context) 时 Handlebars 会转义块助手代码的内容,因此 Handlebars 不会转义块助手代码的返回结果。如果 这样做,代码块内部的内容将被两次转义。

raw: {{{specialChars}}}
html-escaped: {{specialChars}}

第二行中的特殊字符将被转义:

output
raw: & < > " ' ` =
html-escaped: &amp; &lt; &gt; &quot; ' ` =

Handlebars 不会转义 Handlebars.SafeString。如果你正在编写一个自己的生成 HTML 的助手代码,你通常会想返回一个 new Handlebars.SafeString(result)。这种情况下,你将需要手动转义参数。

preparationScript
Handlebars.registerHelper("bold", function(text) {
  var result = "<b>" + Handlebars.escapeExpression(text) + "</b>";
  return new Handlebars.SafeString(result);
});

这将转义传入的参数,但是 response 会被标记为 safe,因此即使未使用“三重隐藏”, Handlebars 也不会尝试转义它。

注意

Handlebars 不会转义 JavaScript 字串。使用 Handlebars 生成 JavaScript(例如内联事件处理程序),可能会产生跨域脚本攻击漏洞 。

代码片段

Handlebars 代码片段通过创建共享模板允许代码复用。你可以使用 registerPartial 方法:

preparationScript
Handlebars.registerPartial(
    "person", 
    "{{person.name}} is {{person.age}} years old.n"
)

以下模板和输入:

template
{{#each persons}}
  {{>person person=.}}
{{/each}}
input
{
  persons: [
    { name: "Nils", age: 20 },
    { name: "Teddy", age: 10 },
    { name: "Nelson", age: 40 }
  ]
}

将渲染得到以下结果:

output
  Nils is 20 years old.
  Teddy is 10 years old.
  Nelson is 40 years old.

了解更多: 代码片段

内置助手代码

Handlebars 提供了各种内置助手代码,例如 if 条件代码块和 each 迭代器。

了解更多: 内置助手代码

API 参考

Handlebars 为应用程序和助手代码提供了各种 API 和实用的方法。

了解更多: API 参考