jQuery .tmpl(), .template()学习资料小结


Posted in Javascript onJuly 18, 2011

昨晚无意中发现一个有趣的jQuery插件.tmpl(),其文档在这里。官方解释对该插件的说明:将匹配的第一个元素作为模板,render指定的数据,签名如下:

.tmpl([data,][options])

其中参数data的用途很明显:用于render的数据,可以是任意js类型,包括数组和对象。options一般情况下都是选项了,官方指出,此处的options是一个用户自定义的键值对的map,继承自tmplItem数据结构,适用于模板render动作期间。

在这里可以下载到最新的tmpl插件,值的一提的是,官方同时也说明了,tmpl目前是beta版,使用需谨慎..

好吧,先来一个最直观的例子:

<%@ Page Language="C#" AutoEventWireup="true" %> 
<!DOCTYPE html> 
<html> 
<head> 
<title>jquery template demo</title> 
<link rel="stylesheet" href="content/site.css" type="text/css" /> 
<link rel="stylesheet" href="content/jquery.ui.css" type="text/css" /> 
<script type="text/javascript" src="scripts/jquery.js"></script> 
<script type="text/javascript" src="scripts/jquery.ui.js"></script> 
<script type="text/javascript" src="scripts/jquery.tmpl.js"></script> 
<script id="myTemplate" type="text/x-jquery-tmpl"> 
<tr><td>${ID}</td><td>${Name}</td></tr> 
</script> 
<script type="text/javascript"> 
$(function () { 
var users = [{ ID: 'think8848', Name: 'Joseph Chan' }, { ID: 'aCloud', Name: 'Mary Cheung'}]; 
$('#myTemplate').tmpl(users).appendTo('#rows'); 
}); 
</script> 
<style type="text/css"> 
body 
{ 
padding: 10px; 
} 
table 
{ 
border-collapse: collapse; 
} 
</style> 
</head> 
<body> 
<table cellspacing="0" cellpadding="3" border="1"> 
<tbody id="rows"> 
</tbody> 
</table> 
</body> 
</html>

jQuery .tmpl(), .template()学习资料小结

例子虽然很小也很简单,但我觉得这个已经很有用了。

当然,.tmpl()还可以使用来自远端的数据,比如说服务:

public ActionResult SampleData() 
{ 
var json = new JsonResult(); 
json.Data = new[] { new { ID = "remote1", Name = "abcd" }, new { ID = "remote2", Name = "efg" } }; 
json.JsonRequestBehavior = JsonRequestBehavior.AllowGet; 
return json; 
}

这是一个MVC的Action,我把它当做是一个提供数据的服务,然后js代码如下:
$('#btnAjax').click(function () { 
$.getJSON('@Url.Action("SampleData", "Home")', function (json) { 
$('#rows').empty(); 
$('#myTemplate').tmpl(json).appendTo('#rows'); 
}); 
});

效果:

jQuery .tmpl(), .template()学习资料小结

定义模板时,推荐的方式为定义使用

做为模板的包装器,但定义方式并不只有这一种,你可以使用

的方式来定义,但是官方文档中说,这种方法可能会产生浏览器无法解析的HTML,因此不推荐使用,不过我试了下,倒没有出什么意外:

HTML:

<div id="container"> 
</div> 
<div id="inline" style="display: none"> 
<label> 
${ID}</label> 
<label> 
${Name}</label><br /> 
</div>

Javascript:
var users = [{ ID: 'think8848', Name: 'Joseph Chan' }, { ID: 'aCloud', Name: 'Mary Cheung'}]; 
$('#inline').tmpl(users).appendTo('#container');

效果:

jQuery .tmpl(), .template()学习资料小结

编译缓存模板,在jQuery .tmpl()中,还可以将模板事先编译并缓存起来,然后在合适的时侯再使用,这对于一些数据嵌套是很有用的,如:
Html

<table cellspacing="0" cellpadding="3" border="1"> 
<tbody id="compileRows"> 
</tbody> 
</table>

Javascript
<script id="compile1" type="text/x-jquery-tmpl"> 
{{tmpl 'cached'}} 
<tr><td>${ID}</td><td>${Name}</td></tr> 
</script> 
<script id="compile2" type="type/x-jquery-tmpl"> 
<tr><td colspan="2">${Group}</td></tr> 
</script> 
<script type="text/javascript"> 
$(function () { 
var groupUsers = [{ ID: 'think8848', Name: 'Joseph Chan', Group: 'Administrators' }, { ID: 'aCloud', Name: 'Mary Cheung', Group: 'Users'}]; 
$('#compile2').template('cached'); 
$('#compile1').tmpl(groupUsers).appendTo('#compileRows'); 
}); 
</script>

效果:

jQuery .tmpl(), .template()学习资料小结

$.template()方法,将一段Html编译为模板,示例:

Javascript

var markup = '<tr><td>${ID}</td><td>${Name}</td></tr>'; 
$.template('template', markup); 
$.tmpl('template', users).appendTo('#templateRows');

这样就可以将markup中定义的模板应用于templateRows对象。
jQuery .tmpl()的标签,表达式,属性:
${}:从前面的例子来看,这个标签的作用很明显了,相当于是占位符,但是它还有另一种写法{{= field}}如:
<script id="myTemplate" type="text/x-jquery-tmpl"> 
<tr><td>{{= ID}}</td><td>{{= Name}}</td></tr> 
</script>

必须要注意的是,"="号后必须跟一个空格,不然是没有效果的。
另外,${}中还可以放表达式,这个牛x吧,如:
Html
<table cellspacing="0" cellpadding="3" border="1"> 
<tbody id="expressionRows"> 
</tbody> 
</table>

Javascript
<script type="text/javascript"> 
$(function () { 
var userLangs = [{ ID: 'think8848', Name: 'Joseph Chan', Langs: ['Chinese', 'English'] }, { ID: 'aCloud', Name: 'Mary Cheung', Langs: ['Chinese', 'French']}]; 
$('#expression').tmpl(userLangs).appendTo('#expressionRows'); 
}); 
</script>

效果:

jQuery .tmpl(), .template()学习资料小结

jQuery .tmpl()有两个比较有用的属性:$item$data:

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

Html

<table cellspacing="0" cellpadding="3" border="1"> 
<tbody id="propertyRows"> 
</tbody> 
</table>

Javascript
<script id="property" type="text/x-jquery-tmpl"> 
<tr><td>${ID}</td><td>${$data.Name}</td><td>${$item.getLangs('; ')}</td></tr> </script> 
<script type="text/javascript"> 
$(function () { 
var userLangs = [{ ID: 'think8848', Name: 'Joseph Chan', Langs: ['Chinese', 'English'] }, { ID: 'aCloud', Name: 'Mary Cheung', Langs: ['Chinese', 'French']}]; 
$('#property').tmpl(userLangs, { 
getLangs: function (separator) { 
return this.data.Langs.join(separator); 
} 
}) 
.appendTo('#propertyRows'); 
}); 
</script>

效果:

jQuery .tmpl(), .template()学习资料小结

{{each}}这个标签一看就知道是做循环用的了,用法如下:

Html

<ul id="eachList"> 
</ul>

Javascript
<script id="each" type="text/x-jquery-tmpl"> 
<li>ID: ${ID}; Name: ${Name};<br />Langs:<ul>{{each Langs}}<li>${$index + 1}: <label>${$value}. </label></li>{{/each}}<ul></li> 
</script> 
<script type="text/javascript"> 
$(function () { 
var userLangs = [{ ID: 'think8848', Name: 'Joseph Chan', Langs: ['Chinese', 'English'] }, { ID: 'aCloud', Name: 'Mary Cheung', Langs: ['Chinese', 'French']}]; 
$('#each').tmpl(userLangs).appendTo('#eachList'); 
});

效果:

jQuery .tmpl(), .template()学习资料小结

{{each}}还有另一种写法:

Javascript

      
  • ID: ${ID}; Name: ${Name};
    Langs:
      {{each(i,lang) Langs}}
    • ${i + 1}:
    • {{/each}}
  • 作用和前一种是一样的。

    {{if}}和{{else}},这两个标签应该一看就知道作用了,直接上示例:

    Javascript

     
          
    ${ID} ${Name} {{if Langs.length > 1}}${Langs.join('; ')}{{else}}${Langs}{{/if}}

    如果Langs数组元素超过1个,则用'; '连接起来,否则就直接显示Langs,效果:

    jQuery .tmpl(), .template()学习资料小结

    {{html}},直接将对象属性值作为HTML代码替换占位符:

    Javascript

     
          
    ${ID} ${Name} {{html Ctrl}}
        $(function () {
            var ctrls = [{ ID: 'think8848', Name: 'Joseph Chan', Ctrl: '' }, { ID: 'aCloud', Name: 'Mary Cheung', Ctrl: ''}];
            $('#html').tmpl(ctrls).appendTo('#htmlRows');
        });

    效果:

    jQuery .tmpl(), .template()学习资料小结

    {{tmpl}},前面已经提过该标签了,这里再给一个使用参数的例子:

    Javascript

           
        
    ${ID} ${Name} {{tmpl($data) '#tmpl2'}}
        {{each Langs}}${$value}  {{/each}}   
        $(function () {
            var userLangs = [{ ID: 'think8848', Name: 'Joseph Chan', Langs: ['Chinese', 'English'] }, { ID: 'aCloud', Name: 'Mary Cheung', Langs: ['Chinese', 'French']}];
            $('#tmpl1').tmpl(userLangs).appendTo('#tmplRows');
        });

    效果:

    jQuery .tmpl(), .template()学习资料小结

    {{wrap}},包装器,这回不需要指定对哪一个元素使用模板了,直接生成模板的包装器,示例:

    Html

     

    Javascript

    The following wraps and reorders some HTML content:
    {{wrap "#tableWrapper"}}
        

    One

        
            First content
        
        

    Two

        
            And more content...
        
    {{/wrap}}
        
            {{each $item.html("h3", true)}}
                
                    ${$value}
                
            {{/each}}
        
        
            {{each $item.html("div")}}
                
                    {{html $value}}
                
            {{/each}}
        
        $(function () {
            $('#myTmpl').tmpl().appendTo('#wrapDemo');
        });

    效果:

    jQuery .tmpl(), .template()学习资料小结

    $.tmplItem()方法,使用这个方法,可以获取从render出来的元素上重新获取$item,示例:

     
    $('tbody').delegate('tr', 'click', function () {
        var item = $.tmplItem(this);
        alert(item.data.Name);
    });

    效果:

    jQuery .tmpl(), .template()学习资料小结

    至此,官方的API中介绍的内容就完了,我的E文水平不高,对于某些细节难免理解不周,如有谬误之处,敬请指正,谢谢。
    源代码下载

    Javascript 相关文章推荐
    IE8下String的Trim()方法失效的解决方法
    Nov 08 Javascript
    javascript实现阻止iOS APP中的链接打开Safari浏览器
    Jun 12 Javascript
    jquery取子节点及当前节点属性值的方法
    Sep 09 Javascript
    JavaScript通过HTML的class来获取HTML元素的方法总结
    May 24 Javascript
    JavaScript中String对象的方法介绍
    Jan 04 Javascript
    不使用 JS 匿名函数理由
    Nov 17 Javascript
    vue里面父组件修改子组件样式的方法
    Feb 03 Javascript
    react-native封装插件swiper的使用方法
    Mar 20 Javascript
    JavaScript常见JSON操作实例分析
    Aug 08 Javascript
    JavaScript对JSON数组简单排序操作示例
    Jan 31 Javascript
    微信小程序 授权登录详解(附完整源码)
    Aug 23 Javascript
    antd table按表格里的日期去排序操作
    Nov 17 Javascript
    JS仿flash上传头像效果实现代码
    Jul 18 #Javascript
    js中的string.format函数代码
    Aug 11 #Javascript
    关于html+ashx开发中几个问题的解决方法
    Jul 18 #Javascript
    TreeView 用法(有代码)(asp.net)
    Jul 15 #Javascript
    基于jquery实现的鼠标滑过按钮改变背景图片
    Jul 15 #Javascript
    jquery 结合C#后台的数组对文章的关键字自动添加链接的代码
    Jul 15 #Javascript
    js实现addClass,removeClass,hasClass的函数代码
    Jul 13 #Javascript
    You might like
    php smarty模版引擎中的缓存应用
    2009/12/02 PHP
    PHP和Mysqlweb应用开发核心技术 第1部分 Php基础-1 开始了解php
    2011/07/03 PHP
    PHP中设置一个严格30分钟过期Session面试题的4种答案
    2014/07/30 PHP
    MacOS 安装 PHP的图片裁剪扩展Tclip
    2015/03/25 PHP
    关于php 高并发解决的一点思路
    2017/04/16 PHP
    Three.js源码阅读笔记(物体是如何组织的)
    2012/12/27 Javascript
    JS阻止冒泡事件以及默认事件发生的简单方法
    2014/01/17 Javascript
    jQuery表单事件实例代码分享
    2016/08/18 Javascript
    React Js 微信禁止复制链接分享禁止隐藏右上角菜单功能
    2017/05/26 Javascript
    jQuery实现的电子时钟效果完整示例
    2018/04/28 jQuery
    JavaScript之实现一个简单的Vue示例
    2019/01/17 Javascript
    javascript实现前端input密码输入强度验证
    2020/06/24 Javascript
    [51:36]EG vs VP 2018国际邀请赛淘汰赛BO3 第一场 8.24
    2018/08/25 DOTA
    在Python中操作时间之mktime()方法的使用教程
    2015/05/22 Python
    python队列通信:rabbitMQ的使用(实例讲解)
    2017/12/22 Python
    对numpy中布尔型数组的处理方法详解
    2018/04/17 Python
    Python3中正则模块re.compile、re.match及re.search函数用法详解
    2018/06/11 Python
    python进行两个表格对比的方法
    2018/06/27 Python
    详解Python用户登录接口的方法
    2019/04/17 Python
    Pandas中Series和DataFrame的索引实现
    2019/06/27 Python
    Python切割图片成九宫格的示例代码
    2020/03/10 Python
    Keras:Unet网络实现多类语义分割方式
    2020/06/11 Python
    Python如何获取文件路径/目录
    2020/09/22 Python
    PyTorch 中的傅里叶卷积实现示例
    2020/12/11 Python
    html5使用canvas实现弹幕功能示例
    2017/09/11 HTML / CSS
    翻新二手苹果产品的网络领导者:Mac of all Trades
    2017/12/19 全球购物
    荷兰游戏商店:Allyouplay
    2019/03/16 全球购物
    《棉鞋里的阳光》教学反思
    2014/04/24 职场文书
    高中班主任评语大全
    2014/04/25 职场文书
    个人课题方案
    2014/05/08 职场文书
    安全责任书范文
    2014/08/25 职场文书
    2014年信访维稳工作总结
    2014/12/08 职场文书
    简历自我评价:教师师德表现自我评价
    2019/04/24 职场文书
    小程序实现悬浮按钮的全过程记录
    2021/10/16 HTML / CSS
    Apache POI的基本使用详解
    2021/11/07 Servers
    Nginx下SSL证书安装部署步骤介绍
    2021/12/06 Servers