Handlebars详解使用

按照我个人习惯和学习的总结,最前面放完整代码是比较合适的,故先放出整个代码,后文再一点点讲解。

完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/jquery-1.8.3.min.js"></script><script src="../js/handlebars-v3.0.0.js"></script>
</head>
<body><script type="text/x-handlebars-template" id="tbody-tr">{{#each student}}<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/each}}</script><table border="1"><thead><tr><th>姓名</th><th>性别</th><th>年龄</th></tr></thead><tbody></tbody></table><script>var houdun={"student":[{"name":'郝某人',"sex":'男',"age":21},{"name":'杜哈哈',"sex":'女',"age":20},{"name":'小郝',"sex":'女',"age":22}]}var myTpl=Handlebars.compile($('#tbody-tr').html());$('tbody').html(myTpl(houdun));</script>
</body>
</html>

使用步骤:

第一步,导入jquery和handlebars的js文件

如果没有对应的文件,可以去我的资源下载,地址:https://download.csdn.net/download/qq_43518645/12664585

<script src="../js/jquery-1.8.3.min.js"></script>
<script src="../js/handlebars-v3.0.0.js"></script>

第二步,构造原始代码。如下

    <table border="1"><thead><tr><th>姓名</th><th>性别</th><th>年龄</th></tr></thead><tbody><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr><tr><td></td><td></td><td></td></tr></tbody></table>

思考:这一块,tbody标签中的元素这么多,而且在实际成产中,tr标签到底有多少个,是不确定的,这种显示的写法明显是不合适的,所以在此引出循环,each,故下文,我们先说 handlebars中each的使用。

each的简单使用

结合上文思考,我们把代码改变为如下内容:

 <thead><tr><th>姓名</th><th>性别</th><th>年龄</th></tr></thead><tbody></tbody></table>

标签中的内容一会我们动态来渲染。

首先,我们模拟一个json数据,用来装配这些tr内容。

<script>var houdun={"student":[{"name":'郝某人',"sex":'男',"age":21},{"name":'杜哈哈',"sex":'女',"age":20},{"name":'小郝',"sex":'女',"age":22}]}</script>

动态的标签

<script type="text/x-handlebars-template" id="tbody-tr">{{#each student}}<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/each}}</script>//注解://<script type="text/x-handlebars-template" id="tbody-tr">//此处type类型一定要指定为text/x-handlebars-template 固定写法,注意一下。//id="tbody-tr"  起一个id,方便后面引入寻找。
// {{#each xxxx}}  xxxx填写的就是要遍历的元素,此处是要遍历模拟的json数据,即student
// {{name}} {{sex}} {{age}}  即取到student中的信息。

实际成产中为了解耦,降低代码耦合度,这种“动态的标签”不会写在当前页面html或者js中,都是独立写出去,再引入,如写入到tpl等等文件中,在此,为了演示方便,入门容易,就暂时写在同一个html或者js中了。在此说明。

上面都是为了代码做准备,其实handlebars中的each使用起来特别简单。

var myTpl=Handlebars.compile($('#tbody-tr').html());
$('tbody').html(myTpl(houdun));

Handlebars.compile() 方法取到内容,此处的Handlebars.compile($(’#tbody-tr’).html())取到的就是下面的内容

 {{#each student}}<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/each}}

取到内容后,要把它装配到哪呢?所以需要指定装配一下$(‘tbody’).html(myTpl(houdun)) 此处一个细节需要注意一下,houdun参数需要传入,要不然json数据在哪来没有指定。装配好之后,相当与这样的。

<thead><tr><th>姓名</th><th>性别</th><th>年龄</th></tr></thead><tbody>{{#each student}}<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/each}}</tbody>

tbody中就有对应的dom节点,并可以读取到json数据,进行渲染。

效果图

each里的this使用

当json报文为下面这种的时候

var houdun=[{"name":'郝某人',"sex":'男',"age":21},{"name":'杜哈哈',"sex":'女',"age":20},{"name":'小郝',"sex":'女',"age":22}]

没有对象的名字,就是拿到一个数据,这个使用,遍历json数据只需要把改为this即可,即修改下面代码。

 {{#each this}}<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/each}}

其余代码均不需要改动。

each里的嵌套使用

如果现在json报文为下面这种情况,我们想让数据这样显示:郝某人的爸爸,郝某人的妈妈,郝某人的女朋友,很显然这种情况是存在的,需要用两层each

        var houdun=[{"name":'郝某人',"info":["爸爸","妈妈","女朋友"]},{"name":'杜哈哈',"info":["哥哥","弟弟","男朋友"]},{"name":'小郝',"info":["爷爷","奶奶","小侄儿"]}]

即需要这样的结构

 <script type="text/x-handlebars-template" id="tbody-tr">{{#each this}}{{#each info}}<tr><td>{{../name}}的{{this}}</td> </tr>{{/each}}{{/each}}</script>//可以看到{{../name}}  这个,做的很人性化,name为第一层循环的信息,放在了 第二层循环的位置,使用../退上去,还是很人性化的。
//{{../name}}的{{this}}  这个this 是因为可以看到  json报文  "info":["爸爸","妈妈","女朋友"]  也是因为没有名字,所以使用this

完整代码:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/jquery-1.8.3.min.js"></script><script src="../js/handlebars-v3.0.0.js"></script>
</head>
<body><script type="text/x-handlebars-template" id="tbody-tr">{{#each this}}{{#each info}}<tr><td>{{../name}}的{{this}}</td> </tr>{{/each}}{{/each}}</script><table border="1"></table><script>var houdun=[{"name":'郝某人',"info":["爸爸","妈妈","女朋友"]},{"name":'杜哈哈',"info":["哥哥","弟弟","男朋友"]},{"name":'小郝',"info":["爷爷","奶奶","小侄儿"]}]var myTpl=Handlebars.compile($('#tbody-tr').html());$('table').html(myTpl(houdun));</script>
</body>
</html>

效果图

each里的index使用

现在,如果有如下需求:

 <tr> <th>序号</th><th>姓名</th><th>性别</th><th>年龄</th></tr>

需要遍历一下序号,怎么做呢?其实很简单,使用{{@index}}即可。

  <script type="text/x-handlebars-template" id="tbody-tr">{{#each student}}<tr><td>{{@index}}</td><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/each}}</script>

可以看到索引下标是从0开始的,如果我们需要从1开始呢?这里呢,也提供了解决办法,我们只需要注册一个帮助模块即可。(我个人的理解,就是注册一个函数,调用这个函数就行)

 Handlebars.registerHelper("addOne",function(index,option){return parseInt(index)+1;})//相当于addOne是自己命名的一个函数名字,我们使用这个函数触发即可。<td>{{addOne @index}}</td>

完整代码

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><script src="../js/jquery-1.8.3.min.js"></script><script src="../js/handlebars-v3.0.0.js"></script>
</head>
<body><script type="text/x-handlebars-template" id="tbody-tr">{{#each student}}<tr><td>{{addOne @index}}</td><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/each}}</script><table border="1"><thead><tr> <th>序号</th><th>姓名</th><th>性别</th><th>年龄</th></tr></thead><tbody></tbody></table><script>var houdun={"student":[{"name":'郝某人',"sex":'男',"age":21},{"name":'杜哈哈',"sex":'女',"age":20},{"name":'小郝',"sex":'女',"age":22}]}var myTpl=Handlebars.compile($('#tbody-tr').html());Handlebars.registerHelper("addOne",function(index,option){return parseInt(index)+1;})$('tbody').html(myTpl(houdun));</script>
</body>
</html>

效果图

each里的if使用

现在有如下需求,json报文段有的没有name字段,如果没有name字段就不让展示。

 var houdun={"student":[{"name":'郝某人',"sex":'男',"age":21},{"name":'杜哈哈',"sex":'女',"age":20},{"sex":'女',"age":22}]}

只需要加入if就行{{#if name}}

 <script type="text/x-handlebars-template" id="tbody-tr">{{#each student}}{{#if name}}<tr><td>{{addOne @index}}</td><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{/if}}{{/each}}</script>

完整代码不贴出来了,就加个if。看效果图。

each里的增强if使用(自定义)

这个在讲解index的使用其实使用过。

就是注册个函数,然后绑定使用函数即可。

 Handlebars.registerHelper("compare", function (v1, v2, options) {if (v1 > v2) {return options.fn(this);} else {return options.inverse(this);}})
//这里强调一下细节点:
Handlebars.registerHelper("compare", function (v1, v2, options) 1、 compare是自己起的名字,可以任意起名字,但是起什么名字,就用什么名字调用。2、 function (v1, v2, options)   v1,v2说明是传入2个参数,options参数应该是指定为块标签。(不确定,应该是)  块标签即为   不带options参数,为行级标签。3、 options.fn(this)  为固定写法,表明如果v1>v2 走if分支,对应的即为走<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>4、 options.inverse(this)  为固定写法,表明如果v1<=v2 走else分支,对应的即为走<tr><td>{{name}}</td><td>{{sex}}</td><td>年龄不大于20</td></tr>
 <script type="text/x-handlebars-template" id="tbody-tr">{{#each student}}{{#compare age 20}}<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td></tr>{{else}}<tr><td>{{name}}</td><td>{{sex}}</td><td>年龄不大于20</td></tr>{{/compare}}{{/each}}</script>

html代码调用处理

这个话题是说什么呢?假如有如下报文段。

 var houdun = {"student": [{"name": '郝某人',"sex": '男',"age": 21,"homePage": '<a href="https://www.baidu.com/">百度首页</a>'},{"name": '杜哈哈',"sex": '女',"age": 20,"homePage": '<a href="https://www.baidu.com/">百度首页</a>'},{"name": '小郝',"sex": '女',"age": 22,"homePage": '<a href="https://www.baidu.com/">百度首页</a>'}]}
 <script type="text/x-handlebars-template" id="tbody-tr">{{#each student}}<tr><td>{{name}}</td><td>{{sex}}</td><td>{{age}}</td><td>{{homePage}}</td></tr>{{/each}}</script><table border="1"><thead><tr><th>序号</th><th>姓名</th><th>性别</th><th>主页</th></tr></thead><tbody></tbody></table><script>

看下效果图:

这显然不是我们想要的,我们想要的是这种的

那是什么原因造成我们的代码没有展示呢?

其实是因为Handlebars为了安全起见,为了防止外部注入,把代码编译成了源码,这样展示的就是刚才的错误展示,但是有时候我们就是想要用这种超链接,那么怎么办呢?其实很简单

 <td>{{{homePage}}}</td>这里用3个{{{}}}即可,之前为2个{{}}

需要注意的是:此处演示的是超链接,其实只要是h5有意义的标签都存在这个问题,比如

哈哈

,都可以使用3个{{{}}}来进行解决。

行级的helper的使用

如果有一段json报文如下:

 var houdun = {"student": [{"name": '郝某人',"sex": 1,"age": 21,"homePage": '<a href="https://www.baidu.com/">百度首页</a>'},{"name": '杜哈哈',"sex": 0,"age": 20,"homePage": '<a href="https://www.baidu.com/">百度首页</a>'},{"name": '小郝',"sex": 1,"age": 22,"homePage": '<a href="https://www.baidu.com/">百度首页</a>'}]}

性别为0和1,1的时候为男,0的时候为女,那应该怎么做呢?其实之前讲过。

Handlebars.registerHelper("sexA", function (v) {if(v==1){return "男";}else if(v==0){return "女";}})<td>{{sexA sex}}</td>可以看到function (v)中没有options参数了,没有即为块标签,其实用法和之前说的一样,比较简单。

效果图

with的使用

with即为进入一个属性当中。

先有如下报文

 var houdun = {"student": [{"name": '郝某人',"sex": 1,"age": 21,"hobby":[{"name":'篮球'},{"name":'排球'},{"name":'乒乓球'}]},{"name": '杜哈哈',"sex": 0,"age": 20,"hobby":[{"name":'篮球'},{"name":'排球'},{"name":'乒乓球'}]},{"name": '小郝',"sex": 1,"age": 22,"hobby":[{"name":'篮球'},{"name":'排球'},{"name":'乒乓球'}]}]}

想显示如下效果图

应该怎么做呢?先用with进入hobby中,再使用each进行遍历

 <td>{{#with hobby}}{{#each this}}<p>{{name}}</p>{{/each}}{{/with}}</td>

其实不用with也行,使用each循环更简单,不过要知道with这个用法。

<td>{{#each hobby}}<p>{{name}}</p>{{/each}}</td>

以上就是所有。结束。今天是杜妹的生日,生日快乐。

Handlebars详解使用相关推荐

  1. handlebars 详解及使用

    1. 前言 handlebars的使用方法和art-template 模板引擎类似,同时支持 NodeJs和浏览器.使用模板引擎的好处就是便于对代码进行维护,同时,使用模板引擎操作DOM,效率也会更高 ...

  2. vscode中setting.json配置详解

    vscode中的setting.json配置文件配置详解 话不多说上配置文件 大家按需复制到自己的setting.json配置文件中即可 [{// 控制是否在编辑器中显示 CodeLens." ...

  3. 在linux安装编译vscode,Linux中安装 Visual Studio Code 详解

    一起来学习如何在 Linux 发行版中安装 Visual Studio Code.Visual Studio Code 是基于 Electron 优化代码后的编辑器,后者是基于 Chromium 的一 ...

  4. 去除html标签 express,详解Express条记之静态衬着HTML(新脚进坑)

    在日常项目中,我喜欢用Django做后端, 因为大而全 如果只是写一个简单服务的话, Express是更好的选择, Express是基于nodejs的一个后端框架,特点是简单,轻量, 容易搭建, 而且 ...

  5. backbone java_Backbone和Angular Java技术详解

    Tomcat系列之Java技术详解 将不同的思想和工具进行对比,是一种更好地理解它们的方式.在本文中,我首先将列举在创建web应用程序时需要重复进行的各项任务,随后为你展现Backbone和Angul ...

  6. 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)

    首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...

  7. JVM年轻代,老年代,永久代详解​​​​​​​

    秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...

  8. docker常用命令详解

    docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...

  9. 通俗易懂word2vec详解词嵌入-深度学习

    https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...

最新文章

  1. 【强化学习】Sarsa 和 Sarsa(λ)
  2. 【数据分析实例】1000 万条淘宝用户行为数据实时分析
  3. equals方法中变量在前和在后的区别
  4. linux ubuntu deepin apache2 rewrite
  5. python 类 文件读写与模块
  6. 李航:做本质的、严谨的、有意思的研究,纪念我的导师长尾真教授
  7. STL基本操作及其运用
  8. oracle恢复表的数据到某个时间点
  9. 机器学习与数据挖掘的关系
  10. [知乎]这可能是最全面的龙芯3A3000处理器评测
  11. 如何建立自己的【渲染农场】终极指南(1)
  12. 球定位实景导航 iOS实用应用周排行
  13. Vue - 将金额数字转为汉字大写(demo)
  14. 计算机网络——分层的体系结构(OSI模型/五层协议栈)
  15. Spring使用纯注解配置事务管理并实现简单的增删查改以及模拟转账功能
  16. 什么是 Holdout Set?
  17. python橙色_如何自定义橙色Firefox菜单按钮的外观
  18. 【devops】非必要 不要自建harbor 能力不足 真的被坑的服了 阿里云ACR不香吗?k8s接入ACR
  19. 【CXY】JAVA基础 之 System
  20. 【Unity3D】学习笔记(第2记) 2D游戏开发基本技巧之背景制作

热门文章

  1. 再见,可恶的桔梗导航!一文搞定chrome浏览器默认打开页面被流氓软件绑定
  2. iSCSI存储系统基础知识(一)
  3. iSCSI存储系统知识详解
  4. 通配符(泛域名)https证书
  5. 是走,是留? 跳槽前6个关键问题须清楚
  6. 最好的Python入门教材是哪本?
  7. Iris Species(鸢尾数据集)
  8. 【使用EasyExcel导入导出】
  9. Win10怎么给磁盘加密?
  10. python实践5 ( 9*9乘法表)