mustache模板技術


一、簡介
Web 模板引擎是為了使用戶界面與業務數據(內容)分離而產生的,它可以生成特定格式的文檔,通常是標准的 HTML 文檔。當然不同的開發語言有不同模板引擎,如 Javascript 下的 Hogan 、ASP 下的 aspTemplate、以及 PHP 下的 Smarty,這里主要介紹基於 Javascript 語言的模板引擎,目前流行有 Mustache、Hogan、doT.js、JsRender、Kendo UI Templates等,jsperf.com 上可以看到它們的性能對比。

Mustache 是一個輕邏輯的模板語言( Logic-less templates),mustache 是一個js模板,用於展示和js分離,它的優勢在於可以應用在 Javascript、PHP、Python、Perl 等多種編程語言中。原本是基於javascript 實現的模板引擎,類似於 freemark和valicity ,但是比freemark和valicity更加輕量級更加容易使用,經過拓展目前支持javascript,java,.NET,PHP,C++等多種 平台下開發! 

  • 項目首頁:http://mustache.github.com/
  • 項目文檔:http://mustache.github.com/mustache.5.html
  • Demo:  http://mustache.github.com/#demo

二、模板:
1)js模板可以是一個html文件

<h1>Hello {{name}}, it is {{timeNow}}.</h1>

2) js模板可以是一個值是html代碼的js變量

var template = "<p>Hello {{name}}, it is {{timeNow}}.</p>";

3) js模板可以是一個script片段

<script id="tpl-greeting" type="text/html">
    <dl>
        <dt>Name</dt>
            <dd>{{name}}</dd>
        <dt>Time</dt>
            <dd>{{timeNow}}</dd>
    </dl>
</script>    

mustache模板語言
1) 變量:  變量標記將當前上下文的變量通過模板渲染,如果當前上下文不存在該變量,則渲染為空串。
默認變量會被經過 HTML 編碼處理,如需顯示原始值,用三個大括號或者在模板標記的初始加入 & 符號。
{{變量名 }} ,{{{變量名 }}}
如果當前鍵為基本或對象,則渲染一次,如果為數組,則渲染數組長度次數。節點以 # 號開始,以 / 結束。
模板:{{#stooges}}<b>{{name}}</b><br>{{/stooges}}"
json: {"stooges":[{"name":"王升"},{"name":"梁文彥"},{"name":"石洋"}]};
2).填充數組節點以 # 號開始,以 / 結束,則渲染數組長度次數。
模板{{#數組}}{{數組內的key}}{{/數組}}

var template = "{{#stooges}}<b>{{name}}</b><br>{{/stooges}}";var view = {"stooges":[{"name":"王升"},{"name":"梁文彥"},{"name":"石洋"}]}

3) .函數作為模板的變量,該函數會在當前列表的每一個元素的上下文迭代執行。

var template = "{{#beatles}}* {{name}}<br/>{{/beatles}}";
var view = {
"beatles": [
    { "firstName": "John", "lastName": "Lennon" },
    { "firstName": "Paul", "lastName": "McCartney" },
    { "firstName": "George", "lastName": "Harrison" },
    { "firstName": "Ringo", "lastName": "Starr" }],
"name": function () {
    return this.firstName + " " + this.lastName;}
};

如果節點鍵的值為函數,注意該函數在執行時的兩個參數,第一個為該節點變量的直接值,第二個為函數,其執行的上下文對應視圖對象

var template = "{{#bold}}Hi {{name}} {{lastName}}.{{/bold}}";
var view = {"name": "John","lastName": "Lennon","bold": function () {
    return function (text, render) {return "<b>" + render(text) + "</b>";}
}}

4) mustache模板使用
模板變量在上下找模板變量需要的數據進行填充。json數據的key跟模板的變量對應就會填充。模板變量和json的key對應不上就不填充。生成展示代碼沒填充的變量不顯示
Mustache.render(template, view)方法填充數據生成展示代碼

  • view——為json數據,作為模板上下文
  • template——為模板對象
//模板
var template = "<p>Hello {{name}}, it is {{{ignore name}}}.it is {{&name}}</p>";
//數據
var date = new Date();
var view = {name: "<b>Jonny</b>",timeNow: date.getHours() + ':' + date.getMinutes() };

使用模板文件要用該方法填充數據生成展示代碼

$.get('模板文件', function(templates) {
    var template = $(templates).html();
    $Mustache.render(template, view);
});

 三、Mustache 語法

Mustache 的模板語法很簡單,就那么幾個,用於HTML,配置文件,源代碼等。它的工作方式是通過通過以哈希值或者對象的方式擴展模板標簽。

  • {{keyName}}
  • {{#keyName}} {{/keyName}}
  • {{^keyName}} {{/keyName}}
  • {{.}}
  • {{<partials}}
  • {{{keyName}}}
  • {{!comments}}
...
<script type="text/javascript" src="mustache.js"></script>
<script type="text/javascript">
var data = {
    "company": "Apple",
    "address": {
        "street": "1 Infinite Loop Cupertino</br>",
        "city": "California ",
        "state": "CA ",
        "zip": "95014 "
    },
    "product": ["Macbook ","iPhone ","iPod ","iPad "]
}
var tpl = '<h1>Hello {{company}}</h1>';
var html = Mustache.render(tpl, data);
console.log( html )
</script>
...

//運行后 Console 輸出:
<h1>Hello Apple</h1>

1. {{keyName}}
{{}}就是 Mustache 的標示符,花括號里的 keyName 表示鍵名,這句的作用是直接輸出與鍵名匹配的鍵值,例如:

var tpl = '{{company}}';
var html = Mustache.render(tpl, data);
//輸出:
Apple

2. {{#keyName}} {{/keyName}}
#開始、以/結束表示區塊,它會根據當前上下文中的鍵值來對區塊進行一次或多次渲染,例如改寫下 Demo 中的 tpl:

var tpl = '{{#address}} <p>{{street}},{{city}},{{state}}</p> {{/address}}';
var html = Mustache.render(tpl, data);

//輸出:
<p>1 Infinite Loop Cupertino&lt;/br&gt;,California,CA</p>

注意:如果{{#keyName}} {{/keyName}}中的 keyName 值為 null, undefined, false;則不渲染輸出任何內容。

3. {{^keyName}} {{/keyName}}
該語法與{{#keyName}} {{/keyName}}類似,不同在於它是當 keyName 值為 null, undefined, false 時才渲染輸出該區塊內容。

var tpl = {{^nothing}}沒找到 nothing 鍵名就會渲染這段{{/nothing}};
var html = Mustache.render(tpl, data);

//輸出:
沒找到 nothing 鍵名就會渲染這段

4. {{.}}
{{.}}表示枚舉,可以循環輸出整個數組,例如:

var tpl = '{{#product}} <p>{{.}}</p> {{/product}}';
var html = Mustache.render(tpl, data);

//輸出:
<p>Macbook iPhone iPod iPad</p>

5. {{>partials}}
>開始表示子模塊,如{{> address}};當結構比較復雜時,我們可以使用該語法將復雜的結構拆分成幾個小的子模塊,例如:

var tpl = "<h1>{{company}}</h1> <ul>{{>address}}</ul>"
var partials = {address: "{{#address}}<li>{{street}}</li><li>{{city}}</li><li>{{state}}</li><li>{{zip}}</li>{{/address}}"}
var html = Mustache.render(tpl, data, partials);

//輸出:
<h1>Apple</h1>
<ul><li>1 Infinite Loop Cupertino&lt;/br&gt;</li><li>California</li><li>CA</li><li>95014</li></ul>  

6. {{{keyName}}}
{{keyName}}輸出會將等特殊字符轉譯,如果想保持內容原樣輸出可以使用{{{}}},例如:

var tpl = '{{#address}} <p>{{{street}}}</p> {{/address}}'

//輸出:
<p>1 Infinite Loop Cupertino</br></p>

7. {{!comments}}
!表示注釋,注釋后不會渲染輸出任何內容。

{{!這里是注釋}}
//輸出:

四、Mustache.java和Mustache.js開發

1. java開發參見https://github.com/spullara/mustache.java

2. js開發參見https://github.com/janl/mustache.js

參考:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM