zoukankan      html  css  js  c++  java
  • 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

    参考:

  • 相关阅读:
    Leetcode Excel Sheet Column Number
    AlgorithmsI PA2: Randomized Queues and Deques Subset
    AlgorithmsI PA2: Randomized Queues and Deques RandomizedQueue
    AlgorithmsI PA2: Randomized Queues and Deques Deque
    AlgorithmsI Programming Assignment 1: PercolationStats.java
    hdu多校第四场 1003 (hdu6616) Divide the Stones 机智题
    hdu多校第四场 1007 (hdu6620) Just an Old Puzzle 逆序对
    hdu多校第四场1001 (hdu6614) AND Minimum Spanning Tree 签到
    hdu多校第三场 1007 (hdu6609) Find the answer 线段树
    hdu多校第三场 1006 (hdu6608) Fansblog Miller-Rabin素性检测
  • 原文地址:https://www.cnblogs.com/JoannaQ/p/3462318.html
Copyright © 2011-2022 走看看