模板引擎

2018-08-06 11:32 更新

模板引擎是基于預定義好的模板,使用填充數(shù)據(jù)(XCO對象)進行數(shù)據(jù)填充,得到渲染后的HTML代碼。

XCO模板引擎的優(yōu)勢:

  1. HTML代碼和JS代碼分離
  2. 保持原有的HTML代碼和結構
  3. 進一步提高編碼效率

1. 使用示例

定義模板:

<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>

類庫說明

  1. xco.variable-1.0.1.js 標記解析類庫
  2. xco.template-1.0.1.js 模板引擎類庫

2.模板的定義和使用

如何定義一個模板呢?之前的示例已經(jīng)給出答案,我們是通過HTML中的注釋標簽<!--...-->來定義模板。注意:一個模板一定要有一個所屬的容器,否則我們怎么找到他呢。在模板中,我們可以設置一些標記,隨后我們在模板填充的時候,將這些標記替換成我們希望的內(nèi)容。

模板中標記分為兩種,一種是變量替換標記,一種是函數(shù)替換標記。

2.1 變量替換

變量替換指的將標記中的變量所對應的內(nèi)容替換此標記。變量替換的標記格式為#{xxx},其中#表示該標記為變量替換標記,xxx為變量名。

2.1.1 變量替換之默認值

#{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的值進行替換,否則此處使用默認值中國進行替換;

2.1.2 變量替換之表達式

在變量替換標記中,允許存在運算表達式;模板引擎會將表達式運算結果作為替換內(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類型。

2.1.3 變量替換之函數(shù)調(diào)用

#{xxx@yyy}表示帶有函數(shù)調(diào)用的變量替換標記。其中:xxx為變量名,@表示后續(xù)的yyy為所調(diào)用的函數(shù)。 模板引擎會對于帶有函數(shù)調(diào)用的變量替換標記的處理流程是:

  1. 取得變量xxx所對應的值,假設為R1;
  2. R1作為yyy入?yún)?,?zhí)行yyy函數(shù),返回結果假設為R2;
  3. 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需要格式化后再進行替換。

2.2 函數(shù)替換

函數(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ū)別

  1. 入?yún)⒉煌?;函?shù)替換的入?yún)檎麄€填充數(shù)據(jù)對象,變量替換之函數(shù)調(diào)用的入?yún)樘畛鋽?shù)據(jù)中某一個值;
  2. 變量替換之函數(shù)調(diào)用一般用作于數(shù)據(jù)的二次處理,而函數(shù)替換一般用作為較為復雜的HTML代碼構建;

2.3 列表渲染

對于使用模板進行頁面渲染,最常見的場景就是列表渲染。

定義模板:

<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>

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號