Handlebars的each和with block helper用法

前言

Handlebars是JavaScript的一个语义模板库,通过对view和data的分离来快速构建web模板。基本用法和安装请看《Handlebars.js 模板引擎》,这里想介绍的是Handlebars里的两个实用helper,each和with。

each block helper

你可以使用handlebars内置的each helper来进行遍历操作,使用this来引用遍历的内容,基本用法如下:

    {{#each people}}
  • {{this}}
  • {{/each}}

对应传入helper的数据是:

{
  people: [ "张三", "李四","冯五" ]
}

对应渲染出来的结果是:

  • 张三
  • 李四
  • 冯五

其实在block helper里你能使用this来代表任何的引用。

项目中遇到空值列表怎么办?可以使用{{else}}来渲染空值内容,比如:

{{#each people}}
  

{{this}}

{{else}}

暂无内容

{{/each}}

在使用each遍历时,你能使用变量{{@index}}来代表元素的下标值,在对象数组里,还能使用{{@key}}来表示下标,比如:

{{#each array}}
  {{@index}}: {{this}}
{{/each}}

// 对象数组
{{#each object}}
  {{@key}}: {{this}}
{{/each}}

还能使用{{@../index}}来表示父级的下标,同时你还能使用@first@last来表示数组里的第一个和最后一个,比如:

{{#each .}}
  

{{this}}

{{/each}}

在Handlebars3.0后,each能使用block parameters,比如:

{{#each users as |user index|}}
  Num: {{index}} Name: {{user.name}}
{{/each}}

其中user是block里的context,等同于this,而index则是对应context的下标值,名字可以随便起,第二个变量可以省略。

with block helper

一般情况下,Handlebars模板会在编译的阶段的时候进行context传递和赋值。使用{{#with}}的方法,我们可以将context转移到数据的一个section里面(如果你的数据包含section)。 这个方法在操作复杂的template时候非常有用,比如:

{{title}}

{{#with author}}

By {{firstName}} {{lastName}}

{{/with}}

数据为:

{
  title: "My first post!",
  author: {
    firstName: "张",
    lastName: "三"
  }
}

小技巧

有时候我们想把一个对象写入data api里,比如{id: 1, name: "julien", birday: "2018-12-09"},但handlebars渲染出来的结果却是data-user="[Object Object]",这时候我们可以自顶一个helper,然后使用JSON.stringify()来转换,比如:

Handlebars.registerHelper('json', function (user) {
    return JSON.stringify(user);
})
// 注意这里的data-user的值要使用单引号

使用时

var data = $('#user-detail').data('user');
console.log(data.name);

运行结果
julien
但个人不建议这样做,特别是服务端回传的数据,这样会把数据全部暴露在html上,所以应该看情况选择合适的方法。

以上是个人的一些使用总结,欢迎指教!

你可能感兴趣的:(Handlebars的each和with block helper用法)