模板引擎之hogan.js
hogan.js 语法简单,且支持循环数据:
基本语法:
1. 标签可以嵌套使用
2. {{data}} 转义的变量,不会渲染html标签
3. {{{data}}} 不转义的变量,会渲染html标签,比如接口返回的富文本编辑器的内容
4. {{#list}} {{/list}} 列表循环 / 真值判断,只能循环数组,不能循环字符串
5. {{^list}} {{/list}} 空列表 / 非真值判断
6. {{.}} 枚举的当前元素 //一般都是枚举数组,不能枚举字符串
7. {{!}} 我是注释
注意事项:
1. hogan.js 如需做接口数据的逻辑处理,可以先用jqery循环再用hogan去渲染
例如: 一个数组Arr包括6个对象,如果只渲染Arr的话 1. 可以直接将 Arr丢给 hogan去渲染,2. 也可以 将Arr用jquery循环后得到每一个对象再丢给hogan去渲染;如需取到数组中每一个对象的id,然后根据这个id去做其他的操作,只能用第2种方法,因为第1种方法不好保存循环出来的每一项的id,第2种方法可以保存,所以应该先用jqery去循环数组Arr,得到每一个对象后再用hogan去渲染AA()函数,得到每一个对象的id再去做其他操作;
$(Arr).each(function (key,val) {
//数据渲染
AA(val); 用hogan去渲染
//其他操作
BB(val.id); 用hogan去渲染
})
2. 接口是对象形式 {"aa": bb} ,可以直接取到 aa
3. 接口是两层或两层以上的数据循环 把接口数据当做标签循环
4. 接口是数组形式 [aa,bb], 用枚举 {{.}} 取到
5. 可以给对象添加一个字段/属性再用hogan渲染出来 obj.aa= bb;
6. hogan本身支持es6模板字符串,如下所示,但是在前后端不彻底分离的情况下很可能会与后端的模板引擎冲突$,导致可以使用``,不能使用$,此时注意:写在html文件中会冲突,单独写在js文件中不会冲突,所以建议把逻辑写在单独的js文件。
`{{#listaa}}
<ul>
<div>我叫{{name}},code=${code}</div>
</ul>
{{/listaa}}`;
7.
参考文档:http://www.imooc.com/article/18493 https://segmentfault.com/a/1190000011401896
github地址:https://github.com/twitter/hogan.js 官网:https://twitter.github.io/hogan.js/
亦可引用BootCDN:BootCDN
一、实际项目中的用法如下:
实际项目中的用法:
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/hogan.js/3.0.2/hogan.js"></script> <script> // 取接口数据
$.ajax({
url: "1.json",
//type: "post",
dataType: "json",
data: {
//"appUserId": appUserId,
//"courseId": courseId
},
success: function (response) {
console.log(response);
var data = response.data;
console.log(data);
// 渲染数据
bind(data);
}
})
// 渲染数据
function bind(data) {
var tpl =
`{{#listaa}}
<ul>
<div>我叫{{name}},我今年{{age}}岁,我喜欢吃{{food}}</div>
{{#videoList}}
<li>{{fileName}}</li>
{{/videoList}} {{!注释: 指定渲染的数据对象后,下面的数据都可以直接用 标签名=数据名,比如此处的videoList}}
</ul>
{{/listaa}}`;
var result = Hogan.compile(tpl).render({
//指定渲染的数据对象,指定渲染的数据对象后,下面的数据都可以直接用 标签名=数据名
listaa: data
});
// 最后添加到指定标签
$('.box').append(result);
} </script>
对应的请求到的 json 数据如下:
对应的请求到的 json 数据如下:
{
"result": true,
"codeDesc": "获取视频成功",
"code": "1",
"data": [
{
"name": "lily",
"age": 18,
"food": "苹果",
"videoList": [
{
"fileName": "aa"
}
]
},
{
"name": "lucy",
"age": 20,
"food": "香蕉",
"videoList": [
{
"fileName": "cc"
},
{
"fileName": "dd"
}
]
}
],
"msg": "获取视频成功"
}
二、详细使用文档
由于公司jsp项目中不支持 ` ` 模板字符串的用法(因为${} 的语法和jsp有冲突),所以本人无意中发现有 hogan.js 这个模板引擎,因为它的语法是 {{}},不会和jsp冲突。
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/hogan.js/3.0.2/hogan.js"></script> <div id="box"> </div>
<script>
// 保存接口数据的对象
var obj = {
data: {
"list": [],
"num": [1,2,3],
"isme": true,//true显示 不显示包括:false、null、undefined、0
"msg":"信息",
},
onload: function () {
// 定义模板
// 有key的循环
var tpl =
`{{#list}}
<div>我叫{{name}}, 今年{{age}}岁, 最爱吃{{food}}</div>
{{/list}}`;
var template = Hogan.compile(tpl);
var result = template.render({list: this.data.list}); // 没有key的循环 只能这样写
// var tpl =
// `{{#list}}
// <div>我叫{{.}}</div>
// {{/list}}`;
// var template = Hogan.compile(tpl);
// var result = template.render({list: this.data.num}); // 对象型用法
// var tpl =
// `{{#list}}
// <div>我叫{{msg}}</div>
// {{/list}}`;
// var template = Hogan.compile(tpl);
// var result = template.render({list: this.data}); // 布尔型用法
// var tpl =
// `{{#list}}
// <div>我叫张瑞奇</div>
// {{/list}}`;
// var template = Hogan.compile(tpl);
// var result = template.render({list: this.data.isme}); // 最后添加到指定标签
$('.box').html(result)
}
}
// 取接口数据
$.ajax({
url: "${ctxStatic}/z-img/1.json",
//type: "post",
dataType: "json",
data: {
//"appUserId": appUserId,
//"courseId": courseId
},
success: function (response) {
console.log(response);
var _data = response.data.dataList;//数组
console.log(_data);
// 将取到的数据赋值给obj的data.list
obj.data.list = _data;
console.log(obj.data.list);
// 渲染完成
obj.onload();
// 其他操作 }
}) </script>
两层循环(及两层以上)用法:
1. 两层循环标准的写法如下,项目中使用这种写法:
两层循环
<script>
var tab = {
data: {
"aa": [
{
"name": "lily",
"age": 18,
"food": "苹果",
"videoList": [
{
"fileName": "aa",
}
]
},
{
"name": "lucy",
"age": 20,
"food": "香蕉",
"videoList": [
{
"fileName": "cc",
},
{
"fileName": "dd",
}
]
}
]
},
onload: function () {
var tpl =
`{{#listaa}}
<ul>
<div>我叫{{name}},我今年{{age}}岁,我喜欢吃{{food}}</div>
{{#videoList}}
{{!注释: 指定渲染的数据对象后,下面的数据都可以直接用 标签名=数据名}}
<li>{{fileName}}</li>
{{/videoList}}
</ul>
{{/listaa}}`;
var template = Hogan.compile(tpl);
var result = template.render({
listaa: this.data.aa //指定渲染的数据对象
});
// 最后添加到指定标签
$('.box').append(result); }
}
// 调用
tab.onload(); </script>
2. 这种写法是 和jquery相结合的,不推荐此种写法,建议使用上面的第一种写法
<script>
var tab = {
data: {
"list": [
{
"name": "lily",
"age": 18,
"food": "苹果",
"videoList": [
{
"fileName": "aa",
},
{
"fileName": "bb",
}
]
},
{
"name": "lucy",
"age": 20,
"food": "香蕉",
"videoList": [
{
"fileName": "cc",
},
{
"fileName": "dd",
}
]
}
],
"num": [1, 2, 3],
"isme": true,//true显示 false不显示
"msg": "信息",
},
onload: function () {
// 定义模板
// 两层循环
var tpl =
`<ul>
{{#aa}}
<div>{{name}}</div>
{{/aa}}
{{#bb}}
<li>{{fileName}}</li>
{{/bb}}
</ul>`;
var template = Hogan.compile(tpl);
$(this.data.list).each(function (key,val) {
//console.log(val);
var result = template.render({
aa: val,
bb: val.videoList
});
// 最后添加到指定标签
$('.box').append(result);
})
}
}
// 调用
tab.onload(); </script>
模板引擎之hogan.js的更多相关文章
- Javascript模板引擎:Hogan
hogan.js是一个开源前端模板引擎,无逻辑的设计,简单好用,性能也不错. 使用 引入hogan.js,下载链接:http://www.bootcdn.cn/hogan.js/,然后通过hogan. ...
- js模板引擎介绍搜集
js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...
- knockout.js模板绑定之利用Underscore.js模板引擎示例
View代码 <h1>People</h1> <ul data-bind="template: { name: 'peopleList' }"> ...
- consolidate.js 一个Node.js 模板引擎的集合
consolidate是一个模板引擎的结合体.包括了常用的jade和ejs.通过配置我们就可以使用多种模板引擎. consolidate.js安装 npm install consolidate co ...
- 推荐13款javascript模板引擎
javaScript 在生成各种页面内容时如果能结合一些模板技术,可以让逻辑和数据之间更加清晰,本文介绍 X 款 JavaScript 的模板引擎.(排名不分先后顺序) 1. Mustache 基于j ...
- 必须掌握的前端模板引擎之art-template
常用的模板引擎有tpl.js.baiduTemplate.doT.js.art-template等等: 我所理解的模板引擎就是把js数据传到html中展示出来: art-template 是一个简约. ...
- Art-Template模板引擎(原生写法与简洁写法)
模板引擎:把js数据转换成html需要的页面,这就是模板引擎需要做的事 • native原生语法 1. 准备数据 2. 把数据转化成html格式的字符串 使用模板引擎 artT ...
- Handlebars的基本用法 Handlebars.js使用介绍 http://handlebarsjs.com/ Handlebars.js 模板引擎 javascript/jquery模板引擎——Handlebars初体验 handlebars.js 入门(1) 作为一名前端的你,必须掌握的模板引擎:Handlebars 前端数据模板handlebars与jquery整
Handlebars的基本用法 使用Handlebars,你可以轻松创建语义化模板,Mustache模板和Handlebars是兼容的,所以你可以将Mustache导入Handlebars以使用 Ha ...
- doT js 模板引擎【初探】要优雅不要污
js中拼接html,总是感觉不够优雅,本着要优雅不要污,决定尝试js模板引擎. JavaScript 模板引擎 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注. ...
随机推荐
- SSO单点登录的发展由来以及实现原理【转】
单点登录以及权限,在很早之前都有写过,不过都比较简单,今天就具体说一下,以及下一步要做的 1.web单系统应用 早期我们开发web应用都是所有的包放在一起打成一个war包放入tomcat容器来运行的, ...
- iTextSharp之pdfRead(两个文件文本内容的比较,指定页数的pdf截取,水印的添加)
using iTextSharp.text; using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System; us ...
- reverse和reverse_copy函数的应用
reverse函数的作用是:反转一个容器内元素的顺序.函数参数:reverse(first,last);//first为容器的首迭代器,last为容器的末迭代器.它没有任何返回值. 这个函数比较简单, ...
- java并发编程实战笔记---(第四章)对象的组合
4.1设计线程安全的类 包含三个基本要素: 1.找出构成对象状态的所有变量 2.找出约束状态变量的不变性条件 2.简历对象状态的并发访问管理策略 对象的状态: 域 基本类型所有域, 引用类型包括被引用 ...
- 当想把html element里面的text提取出来可以试着用正则
var a='123<span>456</span><span class="active">789</span>'; a.repl ...
- IOS - Safari中click点击事件无效
做web移动端页面时,安卓端一点问题也没,发现在ios真机上点击事件无效,发现Safari下只有默认可点击的元素才click点击事件,像span div等元素是不具有点击事件的. 解决问题四种方式: ...
- Oracle与MySQL连接配置
MySQL: Driver: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/GBDSPT(数据库名称) Oracle: Driver:o ...
- [原创] 基于RDP的桌面广播
之前写过一篇使用C# UDP 组播技术做的桌面广播实现, C# 使用UDP组播实现局域网桌面共享.最终效果差强人意,UDP包在不同的交换机上发送还会出现发送失败的情况,所以又重新研究了一些新的方法,包 ...
- 洛谷P3857 [TJOI2008]彩灯 [线性基]
题目传送门 彩灯 题目描述 Peter女朋友的生日快到了,他亲自设计了一组彩灯,想给女朋友一个惊喜.已知一组彩灯是由一排N个独立的灯泡构成的,并且有M个开关控制它们.从数学的角度看,这一排彩灯的任何一 ...
- 深度学习应用系列(四)| 使用 TFLite Android构建自己的图像识别App
深度学习要想落地实践,一个少不了的路径即是朝着智能终端.嵌入式设备等方向发展.但终端设备没有GPU服务器那样的强大性能,那如何使得终端设备应用上深度学习呢? 所幸谷歌已经推出了TFMobile,去年又 ...
