Handlebars详解使用
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详解使用相关推荐
- handlebars 详解及使用
1. 前言 handlebars的使用方法和art-template 模板引擎类似,同时支持 NodeJs和浏览器.使用模板引擎的好处就是便于对代码进行维护,同时,使用模板引擎操作DOM,效率也会更高 ...
- vscode中setting.json配置详解
vscode中的setting.json配置文件配置详解 话不多说上配置文件 大家按需复制到自己的setting.json配置文件中即可 [{// 控制是否在编辑器中显示 CodeLens." ...
- 在linux安装编译vscode,Linux中安装 Visual Studio Code 详解
一起来学习如何在 Linux 发行版中安装 Visual Studio Code.Visual Studio Code 是基于 Electron 优化代码后的编辑器,后者是基于 Chromium 的一 ...
- 去除html标签 express,详解Express条记之静态衬着HTML(新脚进坑)
在日常项目中,我喜欢用Django做后端, 因为大而全 如果只是写一个简单服务的话, Express是更好的选择, Express是基于nodejs的一个后端框架,特点是简单,轻量, 容易搭建, 而且 ...
- backbone java_Backbone和Angular Java技术详解
Tomcat系列之Java技术详解 将不同的思想和工具进行对比,是一种更好地理解它们的方式.在本文中,我首先将列举在创建web应用程序时需要重复进行的各项任务,随后为你展现Backbone和Angul ...
- 从命令行到IDE,版本管理工具Git详解(远程仓库创建+命令行讲解+IDEA集成使用)
首先,Git已经并不只是GitHub,而是所有基于Git的平台,只要在你的电脑上面下载了Git,你就可以通过Git去管理"基于Git的平台"上的代码,常用的平台有GitHub.Gi ...
- JVM年轻代,老年代,永久代详解
秉承不重复造轮子的原则,查看印象笔记分享连接↓↓↓↓ 传送门:JVM年轻代,老年代,永久代详解 速读摘要 最近被问到了这个问题,解释的不是很清晰,有一些概念略微模糊,在此进行整理和记录,分享给大家.在 ...
- docker常用命令详解
docker常用命令详解 本文只记录docker命令在大部分情境下的使用,如果想了解每一个选项的细节,请参考官方文档,这里只作为自己以后的备忘记录下来. 根据自己的理解,总的来说分为以下几种: Doc ...
- 通俗易懂word2vec详解词嵌入-深度学习
https://blog.csdn.net/just_so_so_fnc/article/details/103304995 skip-gram 原理没看完 https://blog.csdn.net ...
最新文章
- 【强化学习】Sarsa 和 Sarsa(λ)
- 【数据分析实例】1000 万条淘宝用户行为数据实时分析
- equals方法中变量在前和在后的区别
- linux ubuntu deepin apache2 rewrite
- python 类 文件读写与模块
- 李航:做本质的、严谨的、有意思的研究,纪念我的导师长尾真教授
- STL基本操作及其运用
- oracle恢复表的数据到某个时间点
- 机器学习与数据挖掘的关系
- [知乎]这可能是最全面的龙芯3A3000处理器评测
- 如何建立自己的【渲染农场】终极指南(1)
- 球定位实景导航 iOS实用应用周排行
- Vue - 将金额数字转为汉字大写(demo)
- 计算机网络——分层的体系结构(OSI模型/五层协议栈)
- Spring使用纯注解配置事务管理并实现简单的增删查改以及模拟转账功能
- 什么是 Holdout Set?
- python橙色_如何自定义橙色Firefox菜单按钮的外观
- 【devops】非必要 不要自建harbor 能力不足 真的被坑的服了 阿里云ACR不香吗?k8s接入ACR
- 【CXY】JAVA基础 之 System
- 【Unity3D】学习笔记(第2记) 2D游戏开发基本技巧之背景制作