个人bolg地址

时至今日,基于后端JavaScript(Node.js)和MVC思想也开始流行起来。模板引擎是数据和页面分离工作中最重要的一环,在各大门户网站均有利用到模板引擎。

模板引擎有很多种,但是原理了解也是非常必要的。

什么是模板引擎,其根本原理就是将数据转换成“String”,再通过模板引擎抓取数据进行页面数据渲染。

看一个例子

 <script type="template" id="template">
<h2>
<a href="{{href}}">
{{title}}
</a>
</h2>
<img src="{{imgSrc}}" alt="{{title}}">
</script>

这样的方法类似Angular和Vue中双向数据绑定。 {{ XXXX }} 是需要进行替换的数据。

var data = [
{
title: "我是标题1",
href: "我是链接1",
imgSrc: "我是图片1.jpg"
},
{
title: "我是标题2",
href: "我是链接2",
imgSrc: "我是图片2.jpg"
}
];

可以通过replace和正则的方法进行替换导入。

replace方法:

template = document.querySelector('#template').innerHTML,
result = document.querySelector('.result'),
attachTemplateToData; // 将模板和数据作为参数,通过数据里所有的项将值替换到模板的标签上(注意不是遍历模板标签,因为标签可能不在数据里存在)。
attachTemplateToData = function(template, data) {
var i = 0,
len = data.length,
fragment = ''; // 遍历数据集合里的每一个项,做相应的替换
function replace(obj) {
var t, key, reg;
      
       //遍历该数据项下所有的属性,将该属性作为key值来查找标签,然后替换
for (key in obj) {
reg = new RegExp('{{' + key + '}}', 'ig');
t = (t || template).replace(reg, obj[key]);
} return t;
} for (; i < len; i++) {
fragment += replace(data[i]);
} return fragment;
}; result.innerHTML = attachTemplateToData(template, data);

不用再次去特意设置变量名。

doT.js模板引擎

1.   {{ = it.xxx }}  赋值

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title> <!-- = 赋值-->
</head>
<body>
<div id="interpolation"></div>
<script id="interpolationtmpl" type="text/x-dot-template"> <!--script的ID是为了被doT模板引擎抓取语法和模板 type必须为该类-->
<div>Hi {{=it.name}}!</div> <!--it在模板里为数据源 it.name 等同于 dataInter.name -->
<div>{{=it.age || ''}}</div> <!-- = 为赋值,如果不存在改数据,||'' 为空 -->
</script>
</body>
<script src="./doT.js"></script>
<script src="./jquery.min.js"></script> <script>
//定义数据源
var dataInter = {"name":"jake","age":31};
  // doT使用模板方法进行抓取script标签里的模板语法和布局
var interText = doT.template($("#interpolationtmpl").text());
  // 将数据赋值给id对应的div进行渲染。
$("#interpolation").html(interText(dataInter));
</script>
</html>

2.   {{ for }}  循环

语法:  {{ for var KEY in DATA {  }}
                {{= key }}
                {{  }  }}

<body>
<div id="evaluation"></div>
<script id="evaluationtmpl" type="text/x-dot-template">
{{ for(var prop in it) { }}
<div>KEY:{{= prop }}--------VALUE:{{= it[prop] }}</div><!--将值进行赋值循环-->
{{ } }}
</script> </body>
<script src="./doT.js"></script>
<script src="./jquery.min.js"></script> <script>
var dataEval = {
"name":"Jake",
"age":31,
"interests":["basketball","hockey","photography"],"contact":{"email":"122@123.com","phone":"999999999"}
};
var evalText = doT.template($("#evaluationtmpl").text());
$("#evaluation").html(evalText(dataEval)); </script>

要注意 {{ for(var prop in it) { }}  ...  {{  } }}   为闭合标签,是为了让其中的模板进行输出,以及让{{ ... }} 的表达式进行执行。

可能这种语法很多小伙伴们看不懂,但是 改变一下

 for(var prop in it) {
<div>KEY:{{= prop }}--------VALUE:{{= it[prop] }}</div> <!--将循环进行赋值-->
} 把外面的花括号去掉了就能看懂了把。和上相比,只是将表达式都用双花括号包围起来,以便给doT模板引擎识别。
{{ for(var prop in it) { }}
<div>KEY:{{= prop }}--------VALUE:{{= it[prop] }}</div><!--将值进行赋值循环-->
{{ } }}

3.   {{~it.array:value:index}}  数组数据

语法:
     {{~data.array :value:index }}
       ...

<body>
<div id="arrays"></div>
<script id="arraystmpl" type="text/x-dot-template">
{{~it.array:value:index}} <-- ~ 为循环数组it.data -->
<div>{{= index+1 }}{{= value}}</div> <!--index为下标,初始值为0 ,可以进行计算-->
{{~}}
</script>
</body>
<script src="./doT.js"></script>
<script src="./jquery.min.js"></script> <script>
var dataArr = {"array":["banana","apple","orange"]};
var arrText = doT.template($("#arraystmpl").text());
$("#arrays").html(arrText(dataArr));
</script>

4.   {{ = it.xxx }}  赋值

语法:

{{? }} if
      {{?? }} else if
      {{??}} else

<body>
<div id="condition"></div>
<script id="conditionstmpl" type="text/x-dot-template"> {{? !it.name }}<!--if有数据就跳过-->
<div>Oh, I love your name, {{=it.name}}!</div>
{{?? it.age === 1}}<!-- else if (age=31)执行此 -->
<div>当前值为{{= it.age}}</div>
{{?? !(it.age === 0)}}<!-- else if (age不为0)执行此 -->
<div>Guess nobody named you yet!</div>
{{?? !it.age == 0)}}<!-- 0本身为false 所有age为true 取反 -->
<div>Guess nobody named you yet!</div>
{{??}}
You are {{=it.age}} and still dont have a name?
{{?}} </script>
</body>
<script src="./doT.js"></script>
<script src="./jquery.min.js"></script> <script>
var dataEncode = {"name":"yzw","age":1};
var EncodeText = doT.template($("#conditionstmpl").text());
$("#condition").html(EncodeText(dataEncode));
</script>

提示:!it.age  当age为0的时候为true,非0为false,但是进行数据恒等(===)的时候,

如果想要将数据的结果进行取反,必须加个括号!(it.age === 0)  当age为0  ,为false  不等于!it.age === 0;

模板引擎还是非常好用的,其余的{{for 插值 with encoding }}、{{##}}就不在本文叙述了,在使用过程中至今还未使用到。

doT.js模板引擎及基础原理的更多相关文章

  1. doT js 模板引擎【初探】要优雅不要污

    js中拼接html,总是感觉不够优雅,本着要优雅不要污,决定尝试js模板引擎. JavaScript 模板引擎 JavaScript 模板引擎作为数据与界面分离工作中最重要一环,越来越受开发者关注. ...

  2. doT.js 模板引擎的使用

    dot.js是一个模板框架,在web前端使用. dot.js作为模板引擎, 主要的用途就是,在写好的模板上,放进数据,生成含有数据的html代码. 这是很简单的web前端模板框架, 简单说几个东西,你 ...

  3. 各种JS模板引擎对比数据(高性能JavaScript模板引擎)

    最近做了JS模板引擎测试,拿各个JS模板引擎在不同浏览器上去运行同一程序,下面是模板引擎测试数据:通过测试artTemplate.juicer与doT引擎模板整体性能要有绝对优势: js模板引擎 Ja ...

  4. 调研js模板引擎

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  5. js模板引擎介绍搜集

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  6. 浅析js模板引擎

    js模板引擎越来越多的得到应用,如今已经出现了几十种js模板引擎,国内各大互联网公司也都开发了自己的js模板引擎(淘宝的kissy template,腾讯的artTemplate,百度的baiduTe ...

  7. js模板引擎

    js模板引擎包括如下: template 官方参考:http://aui.github.io/artTemplate BaiduTemplate 官方参考:http://baidufe.github. ...

  8. Epii.js 一个极其简单的Js模板引擎

    Epii.js 简约而不简单的Js模板引擎 Epii.js 简约而不简单的JavaScript模板引擎 # 特性 一个轻量级模板引擎,可快速实现数据与ui绑定(数据变动,UI自动变动),快速实现事件绑 ...

  9. 使用新一代js模板引擎NornJ提升React.js开发体验

    当前的前端世界中有很多著名的开源javascript模板引擎如Handlebars.Nunjucks.EJS等等,相信很多人对它们都并不陌生. js模板引擎的现状 通常来讲,这些js模板引擎项目都有一 ...

随机推荐

  1. 夏令营讲课内容整理 Day 5.

    DP专场.. 动态规划是运筹学的一个分支, 求解决策过程最优化的数学方法. 我们一般把动态规划简称为DP(Dynamic Programming)   1.动态规划的背包问题 有一个容量为m的背包,有 ...

  2. BZOJ 1488: [HNOI2009]图的同构 [Polya]

    完全图中选出不同构的简单图有多少个 上题简化版,只有两种颜色....直接copy就行了 太诡异了,刚才电脑上多了一个不动的鼠标指针,然后打开显卡管理界面就没了 #include<iostream ...

  3. BZOJ 1025: [SCOI2009]游戏 [置换群 DP]

    传送门 题意:求$n$个数组成的排列变为升序有多少种不同的步数 步数就是循环长度的$lcm$..... 那么就是求$n$划分成一些数几种不同的$lcm$咯 然后我太弱了这种$DP$都想不出来.... ...

  4. SpringMVC之Http标准的头部信息

  5. Flask 开发| Flaskr 开发内容总结

    Flaskr 开发说明 官方文档 http://flask.pocoo.org/docs/0.12/tutorial/ 演示网站 http://flaskr.it592.com/ 涉及到的内容: 连接 ...

  6. php+redis 学习 五 消息推送

    <?php header('content-type:text/html;chaeset=utf-8'); /** * redis实战 * * 发布 * * @example php publi ...

  7. sparksql工程小记

    最近做一个oracle项目迁移工作,跟着spark架构师学着做,进行一些方法的总结. 1.首先,创建SparkSession对象(老版本为sparkContext) val session = Spa ...

  8. 【国家集训队2010】小Z的袜子[莫队算法]

    [莫队算法][国家集训队2010]小Z的袜子 Description 作为一个生活散漫的人,小Z每天早上都要耗费很久从一堆五颜六色的袜子中找出一双来穿.终于有一天,小Z再也无法忍受这恼人的找袜子过程, ...

  9. linux下安装jdk,tomcat以及mysql

    环境:centOS6.8.jdk1.8,tomcat-8.5.15,mysql-5.7.18 1.  安装JDK 注意:rpm与软件相关命令 相当于window下的软件助手 管理软件 步骤: 1)查看 ...

  10. Linux命令之tar-rsync

    一.tar命令 可以对文件和目录进行打包压缩(相较于zip.gzip.bzip2不能对目录进行压缩,tar是一大优势) 用途:制作归档文件.释放归档文件 基本格式: 压缩---> tar  [选 ...