Mustache

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Fighting_No1/article/details/84894610

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++等多种 平台下开发!

二、使用步骤

1、通过script标签引入mustache的js文件

<script type="text/javascript" src="mustache.js"></script>

2、定义模板字符串

定义模板字符串有三种方式:

  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>
    

    然后在编译模板之前,通过获取 tpl-greeting 的 innerHTML 定义原始模板串:

    var template = document.getElementById('tpl-greeting').innerHTML.trim();

3、预编译模板

使用 parse 函数进行预编译模板,即

Mustache.parse(template);

要注意,经过预编译后的 template 已经不是原来的模板字符串了,连接数据类型都变成了数组类型。

4、 渲染模板

使用 render 函数进行渲染,即

var rendered = Mustache.render(template, obj)

  • template——为模板对象
  • obj——为json数据,是数据源对象,作为模板上下文。mustache 会把模板中属性标签替换成与 obj 对象属性名相同的属性值。

5、替换 DOM 内容

将渲染后的数据挂载到DOM树上。

//模板
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;则不渲染输出任何内容。

    函数作为模板的变量,该函数会在当前列表的每一个元素的上下文迭代执行。

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

    如果keyName的值为函数,注意该函数在执行时的两个参数,第一个为该节点变量的直接值,第二个为函数,其执行的上下文对应视图对象

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

    {{.}}

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

猜你喜欢

转载自blog.csdn.net/Fighting_No1/article/details/84894610
今日推荐