语言指南 - 介绍
什么是 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 简单访问每个对象的属性表达式。
<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}}
preparationScriptHandlebars.registerHelper('loud', function (aString) {
return aString.toUpperCase()
})
助手代码将当前上下文作为函数的 this
指针接收。
{{#each people}}
{{print_person}}
{{/each}}
preparationScriptHandlebars.registerHelper('print_person', function () {
return this.firstname + ' ' + this.lastname
})
块助手代码
代码块表达式使你可以自定义这样的助手代码:这个助手代码可以使用与当前上下文不同的上下文来调用模板。这些块助手代码在名称前 以 # 号标识,并且需要一个名称相同的结束模板 /
。让我们考虑一个生成 HTML 列表的助手代码:
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}}
第二行中的特殊字符将被转义:
outputraw: & < > " ' ` =
html-escaped: & < > " ' ` =
Handlebars 不会转义 Handlebars.SafeString
。如果你正在编写一个自己的生成 HTML 的助手代码,你通常会想返回一个 new Handlebars.SafeString(result)
。这种情况下,你将需要手动转义参数。
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
方法:
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 和实用的方法。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论