個人bolg地址
時至今日,基於后端JavaScript(Node.js)和MVC思想也開始流行起來。模板引擎是數據和頁面分離工作中最重要的一環,在各大門戶網站均有利用到模板引擎。
模板引擎有很多種,但是原理了解也是非常必要的。
什么是模板引擎,其根本原理就是將數據轉換成“String”,再通過模板引擎抓取數據進行頁面數據渲染。
看一個例子
1 <script type="template" id="template"> 2 <h2> 3 <a href="{{href}}"> 4 {{title}} 5 </a> 6 </h2> 7 <img src="{{imgSrc}}" alt="{{title}}"> 8 </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 }}、{{##}}就不在本文敘述了,在使用過程中至今還未使用到。