模板引擎是基于預定義好的模板,使用填充數(shù)據(jù)(XCO對象)進行數(shù)據(jù)填充,得到渲染后的HTML代碼。
XCO模板引擎的優(yōu)勢:
定義模板:
<div id="container"><!-- <p>用戶ID: #{id}</p> <p>用戶名: #{name}</p> --></div>
填充數(shù)據(jù)
<script type="text/javascript" src="/js/jquery-1.11.1.min.js"></script> <script type="text/javascript" src="/js/xco-1.0.1.js"></script> <script type="text/javascript" src="/js/xco.jquery-1.0.2.js"></script> <script type="text/javascript" src="/js/xco.variable-1.0.1.js"></script> <script type="text/javascript" src="/js/xco.template-1.0.1.js"></script> <script type="text/javascript"> XCOTemplate.pretreatment('container'); // 模板預處理
function doSubmit() { var xco = new XCO(); // 設置請求參數(shù)的值 var options = { url : "/m1.xco", data : xco, success : doCallBack }; $.doXcoRequest(options); } function doCallBack(data) { var html = XCOTemplate.execute("container", data); // 填充模板, data為XCO對象 document.getElementById("container").innerHTML = html; // 渲染頁面 } </script>
說明:doCallBack方法中的data
參數(shù)為XCO請求后的返回結果,是一個XCO對象,用XML格式表示如下:
<?xml version="1.0" encoding="UTF-8"?> <X> <I K="id" V="1001"/> <S K="name" V="張三"/> </X>
渲染后的HTML
<div id="container"> <p>用戶ID: 1001</p> <p>用戶名: 張三</p> </div>
類庫說明
xco.variable-1.0.1.js
標記解析類庫xco.template-1.0.1.js
模板引擎類庫
如何定義一個模板呢?之前的示例已經(jīng)給出答案,我們是通過HTML中的注釋標簽<!--...-->
來定義模板。注意:一個模板一定要有一個所屬的容器,否則我們怎么找到他呢。在模板中,我們可以設置一些標記,隨后我們在模板填充的時候,將這些標記替換成我們希望的內(nèi)容。
模板中標記分為兩種,一種是變量替換標記,一種是函數(shù)替換標記。
變量替換指的將標記中的變量所對應的內(nèi)容替換此標記。變量替換的標記格式為#{xxx}
,其中#
表示該標記為變量替換標記,xxx
為變量名。
#{xxx|yyy}
表示帶有默認值的變量替換標記。其中:xxx
為變量名,|
表示后續(xù)的yyy
為默認值。
當填充數(shù)據(jù)中,變量xxx
所對應的值不存在的時候,將使用此默認值進行替換。
示例
<div id="container"><!-- <p>#{x|123}</p> <p>#{y|'中國'}</p> --></div>
填充的數(shù)據(jù)
<?xml version="1.0" encoding="UTF-8"?> <X> <I K="x" V="1001"/> </X>
渲染后的HTML
<div id="container"> <p>1001</p> <p>中國</p> </div>
說明:
如果模板填充數(shù)據(jù)中存在x
,則取x
的值進行替換,否則此處使用默認值123
進行替換;如果模板填充數(shù)據(jù)中存在y
,則取y
的值進行替換,否則此處使用默認值中國
進行替換;
在變量替換標記中,允許存在運算表達式;模板引擎會將表達式運算結果作為替換內(nèi)容。
示例
<div id="container"><!-- <p>#{x+y}</p> <p>#{xy}</p> <p>#{x+yz}</p> <p>#{money + '$'}</p> --></div>
填充的數(shù)據(jù)
<?xml version="1.0" encoding="UTF-8"?> <X> <I K="x" V="1"/> <I K="y" V="2"/> <I K="z" V="3"/> <D K="money" V="1558.3"/> </X>
渲染后的HTML
<div id="container"> <p>3</p> <p>2</p> <p>7</p> <p>1558.3$</p> </div>
說明:
目前支持的運算符包括:+
、-
、*
、/
、(
、)
。如果變量替換標記中的變量均為Number
類型,則表達式為四則運算表達式,運算后的結果為Number
類型;如果其中變量為String
類型,則表達式代表字符串相加,運算后的結果為String
類型。
#{xxx@yyy}
表示帶有函數(shù)調(diào)用的變量替換標記。其中:xxx
為變量名,@
表示后續(xù)的yyy
為所調(diào)用的函數(shù)。
模板引擎會對于帶有函數(shù)調(diào)用的變量替換標記的處理流程是:
xxx
所對應的值,假設為R1
;R1
作為yyy
入?yún)?,?zhí)行yyy
函數(shù),返回結果假設為R2
;R2
作為替換內(nèi)容進行替換;示例
<div id="container"><!-- <p>#{create_time@formatDateTime}</p> --></div>
填充數(shù)據(jù)
<?xml version="1.0" encoding="UTF-8"?> <X> <A K="create_time" V="2016-08-03 19:27:06"/> </X>
相關函數(shù)
function formatDateTime(_date) { return this.format(date, "yyyy-MM-dd"); // 格式化時間 }
渲染后的HTML
<div id="container"> <p>2016-08-03</p> </div>
說明
對于函數(shù)調(diào)用這種方式,一般的應用場景是對于返回結果中的值做二次處理。比如之前示例中的create_time
需要格式化后再進行替換。
函數(shù)替換指的是直接將一個函數(shù)的返回值作為替換內(nèi)容。函數(shù)替換的標記格式為@{xxx}
,其中@
表示該標記為函數(shù)替換標記,xxx
為函數(shù)名。
示例
<div id="container"><!-- <p>@{getOrderOp}</p> --></div>
填充數(shù)據(jù)
<?xml version="1.0" encoding="UTF-8"?> <X> <L K="order_id" V="10001"/> <I K="order_state" V="1"/> </X>
調(diào)用示例
function doCallBack(data) { var ext = { // 函數(shù)容器對象 getOrderOp : function(xco) { // 對應函數(shù)替換標記中的函數(shù) if(1 == xco.get('order_state')){ return '<a href="###" onclick="pay(' + xco.get('order_id') + ')">支付</a>'; } else if(2 == xco.get('order_state')){ return '<a href="###" onclick="confirmReceipt(' + xco.get('order_id') + ')">確認收貨</a>'; } else { return '<a href="/order_detail.jsp?order_id=' + xco.get('order_id') + '">查看詳情</a>'; } } } var html = XCOTemplate.execute("container", data, ext); // 填充模板, data為XCO對象 document.getElementById("container").innerHTML = html; // 渲染頁面 }
渲染后的HTML
<div id="container"> <p><a href="###" onclick="pay(10001)">支付</a></p> </div>
說明
在使用函數(shù)替換的時候,需要額外傳入一個ext
對象,該對象中所包含的函數(shù)(方法)即為函數(shù)替換所用到的函數(shù)。對于函數(shù)getOrderOp
的入?yún)?code>xco,就是填充模板時傳入的填充數(shù)據(jù)data
,由框架自動傳入。
函數(shù)替換和變量替換之函數(shù)調(diào)用的區(qū)別
對于使用模板進行頁面渲染,最常見的場景就是列表渲染。
定義模板:
<table>
<thead>
<tr>
<th>用戶ID</th>
<th>用戶姓名</th>
</tr>
<tbody id="users"><!--
<tr>
<td>#{users[i].user_id}</td>
<td>#{users[i].user_name}</td>
</tr>
--></tbody>
</thead>
</table>
填充的數(shù)據(jù)
<?xml version="1.0" encoding="UTF-8"?> <X> <XL K="users"> <X> <L K="user_id" V="101"/> <S K="user_name" V="張三"/> </X> <X> <L K="user_id" V="102"/> <S K="user_name" V="李四"/> </X> <X> <L K="user_id" V="103"/> <S K="user_name" V="王五"/> </X> <X> <L K="user_id" V="104"/> <S K="user_name" V="趙六"/> </X> </XL> <I K="$$CODE" V="0"/> </X>
調(diào)用示例
function doCallBack(data) {
var dataList = data.getXCOListValue("users");
var html = '';
for (var i = 0; i < dataList.length; i++) {
data.setIntegerValue("i", i);
html += XCOTemplate.execute("users", data);
}
document.getElementById("users").innerHTML = html;
}
渲染后的HTML
<table>
<thead>
<tr>
<th>用戶ID</th>
<th>用戶姓名</th>
</tr>
<tbody id="users">
<tr>
<td>101</td>
<td>張三</td>
</tr>
<tr>
<td>102</td>
<td>李四</td>
</tr>
<tr>
<td>103</td>
<td>王五</td>
</tr>
<tr>
<td>104</td>
<td>趙六</td>
</tr>
</tbody>
</thead>
</table>
更多建議: