jQuery-tmpl

1,094 阅读1分钟

jQuery-tmpl用于模板渲染用法如下:

.tmpl([data,][options])
  • 将匹配的第一个元素作为模板,render指定的数据,data用于render的数据,可以是任意js类型,包括数组和对象。options一般情况下都是选项了,官方指出,此处的options是一个用户自定义的键值对的map,继承自tmplItem数据结构,适用于模板render动作期间。
  • 我自己一般options是传入渲染模板还需的辅助的数据

tmpl的基本使用(分别传入对象和数组)

${}就相当于占位符,也可以用{{= }},= 后面必须加个空格

<body>
    <div class="box1"></div>
    <div class="box2"></div>
    <!-- 对象数据的模板 -->
    <script type="text/x-jquery-tmpl" id="objTmpl">
        <p>${id}</p>
        <p>${name}</p>
        <p>{{= age}}</p>
    </script>
    <!-- 数组数据的模板-数组数据会自动遍历一层 -->
    <script type="text/x-jquery-tmpl" id="arrTmpl">
        <ul>
            <li>${name}</li>
            <li>${age}</li>
        </ul>
    </script>
    <script>
        var obj = { id: '01', name: 'www', age: 22 };
        $('#objTmpl').tmpl(obj).appendTo(".box1");

        var arr = [{ name: 'kkk', age: 22 }, { name: 'qq', age: 19 }, { name: 'mm', age: 23 }]
        $('#arrTmpl').tmpl(arr).appendTo(".box2");


    </script>
</body>

效果

image.png

tmpl中重要的两个属性

$item代表当前的模板;$data代表当前的数据。

<body>
    <div class="box2"></div>

    <script type="text/x-jquery-tmpl" id="arrTmpl">
        <ul>
            <li>${$data}</li>
            <!-- 只是为了看清楚,$data为当前数据 -->
            <li>${JSON.stringify($data)}</li>
            <li>${$item.setData()}</li>
            <li>${console.log($item)}</li>
        </ul>
    </script>
    
    <script>
        var arr = [{ name: 'kkk', age: 22 }, { name: 'qq', age: 19 }, { name: 'mm', age: 23 }]
        // 传入数据并传入一些辅助的东西
        $('#arrTmpl').tmpl(arr,{
            setData:function(){
                return "姓名:"+ this.data.name +",年龄:"+this.data.age;            }
        }).appendTo(".box2");
    </script>
</body>

image.png

image.png

{{each}}循环和{{if}}和{{else}}判断

{{each}}有两种写法,第一种默认写法:{{each arr}} 这样值为$value,索引为$index。第二种自定义写法:{{each(i,item) arr}} 这样值为item,索引为 i。

<body>
    <div class="box"></div>
    <script type="text/x-jquery-tmpl" id="tmpl">
        {{if $data.length <= 1}}
            <ul>
                <h1>单条数据</h1>
                <p>${$data[0].name}</p>
            </ul>
        {{else}}
            <ul>
                <h1>多条数据</h1>
                {{each $data}}
                    <li>${$index}---${$value.name}</li>
                {{/each}}
            </ul>
        {{/if}}
        
    </script>
    <script>
        var arr = [[{name:'ww',age:11}],[{name:'qq',age:12},{name:'kk',age:23}]]
        $("#tmpl").tmpl(arr).appendTo(".box");
    </script>
</body>

image.png

image.png

{{html}}输出变量html,但是没有html编码

<body>
    <div class="box"></div>
    <script type="text/x-jquery-tmpl" id="tmpl">
        <p>${html}</p>
        <p>{{html html}}</p>
    </script>
    <script>
        var data = {html:'<button>按钮</button>'};
        $('#tmpl').tmpl(data).appendTo(".box");
    </script>
</body>

image.png

{{tmpl}} 嵌套模板

<body>
    <div id="tmpl"></div>
    <script id="tmpl1" type="text/x-jquery-tmpl">
        <div style="margin-bottom:10px;">
          <span>${ID}</span>
          <span style="margin-left:10px;">{{tmpl($data) '#tmpl2'}}</span>
        </div>     
    </script>
    <script id="tmpl2" type="type/x-jquery-tmpl">
        {{each Name}}${$value}  {{/each}}   
    </script>
    <script type="text/javascript">
      var users = [{ ID: 'think8848', Name: ['Joseph', 'Chan'] }, { ID: 'aCloud', Name: ['Mary', 'Cheung']}];
       $("#tmpl1").tmpl(users).appendTo('#tmpl');
    </script>
</body>

image.png

{{warp}}包装器

<body>
    <div id="wrapDemo">
    </div>
<script id="myTmpl" type="text/x-jquery-tmpl">
    The following wraps and reorders some HTML content:
    {{wrap "#tableWrapper"}}
        <h3>One</h3>
        <div>
            First <b>content</b>
        </div>
        <h3>Two</h3>
        <div>
            And <em>more</em> <b>content</b>...
        </div>
    {{/wrap}}
    </script>
<script id="tableWrapper" type="text/x-jquery-tmpl">
    <table cellspacing="0" cellpadding="3" border="1"><tbody>
        <tr>
            ${console.log($item)}
            {{each $item.html("div", true)}}
            <!-- true表示获取获取标签中的文本内容,false表示获取包括标签的全部内容 -->
                <td>
                    ${$value}
                </td>
            {{/each}}
        </tr>
        <tr>
            {{each $item.html("div")}}
                <td>
                    {{= $value}}
                    {{html $value}}
                </td>
            {{/each}}
        </tr>
    </tbody></table>
    </script>
 <script type="text/javascript">
        $(function () {
            $('#myTmpl').tmpl().appendTo('#wrapDemo');
        });
    </script>
</body>

image.png

image.png

补充方法

  • $.tmplItem() 方法,使用这个方法,可以获取从render出来的元素上重新获取$item
  • $.template()方法,将一段Html编译为模板
var markup =  '<tr><td>${ID}</td><td>${Name}</td></tr>';
$.template('template', markup);
$.tmpl('template', users).appendTo('#templateRows');

引用: