Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 638|回复: 0

[默认分类] [原]jQuery .tmpl(), .template()学习

[复制链接]
  • TA的每日心情
    开心
    2021-12-13 21:45
  • 签到天数: 15 天

    [LV.4]偶尔看看III

    发表于 2018-5-30 15:36:41 | 显示全部楼层 |阅读模式
    昨晚无意中发现一个有趣的jQuery插件.tmpl(),其文档在这里
    官方解释对该插件的说明:将匹配的第一个元素作为模板,render指定的数据,签名如下:

    1. .tmpl([data,][options])
    复制代码


    其中参数data的用途很明显:用于render的数据,可以是任意js类型,包括数组和对象。options一般情况下都是选项了,官方指出,此处的options是一个用户自定义的键值对的map,继承自tmplItem数据结构,适用于模板render动作期间。
    这里可以下载到最新的tmpl插件,值的一提的是,官方同时也说明了,tmpl目前是beta版,使用需谨慎..
    好吧,先来一个最直观的例子:

    1. <%@ Page Language="C#" AutoEventWireup="true" %>
    2. <!DOCTYPE html>
    3. <html>
    4. <head>
    5.     <title>jquery template demo</title>
    6.     <link rel="stylesheet" href="content/site.css" type="text/css" />
    7.     <link rel="stylesheet" href="content/jquery.ui.css" type="text/css" />
    8.     <script type="text/javascript" src="scripts/jquery.js"></script>
    9.     <script type="text/javascript" src="scripts/jquery.ui.js"></script>
    10.     <script type="text/javascript" src="scripts/jquery.tmpl.js"></script>
    11.     <script id="myTemplate" type="text/x-jquery-tmpl">
    12.         <tr><td>${ID}</td><td>${Name}</td></tr>
    13.     </script>
    14.     <script type="text/javascript">
    15.         $(function () {
    16.             var users = [{ ID: "think8848", Name: "Joseph Chan" }, { ID: "aCloud", Name: "Mary Cheung"}];
    17.             $("#myTemplate").tmpl(users).appendTo("#rows");
    18.         });
    19.     </script>
    20.     <style type="text/css">
    21.         body
    22.         {
    23.             padding: 10px;
    24.         }
    25.         table
    26.         {
    27.             border-collapse: collapse;
    28.         }
    29.     </style>
    30. </head>
    31. <body>
    32.     <table cellspacing="0" cellpadding="3" border="1">
    33.         <tbody id="rows">
    34.         </tbody>
    35.     </table>
    36. </body>
    37. </html>
    复制代码



    例子虽然很小也很简单,但我觉得这个已经很有用了。
    当然,.tmpl()还可以使用来自远端的数据,比如说服务:

    1.         public ActionResult SampleData()
    2.         {
    3.             var json = new JsonResult();
    4.             json.Data = new[] { new { ID = "remote1", Name = "abcd" }, new { ID = "remote2", Name = "efg" } };
    5.             json.JsonRequestBehavior = JsonRequestBehavior.AllowGet;
    6.             return json;
    7.         }
    复制代码


    这是一个MVC的Action,我把它当做是一个提供数据的服务,然后js代码如下:

    1.             $("#btnAjax").click(function () {
    2.                 $.getJSON("@Url.Action("SampleData", "Home")", function (json) {
    3.                     $("#rows").empty();
    4.                     $("#myTemplate").tmpl(json).appendTo("#rows");
    5.                 });
    6.             });
    复制代码


    效果:

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

    1. <script id="templateName"  type="text/x-jquery-tmpl"></script>
    复制代码


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

    1. <div id="template" style="display: none;"> <!-- markup --></div>
    复制代码


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

    1.     <div id="container">
    2.     </div>
    3.     <div id="inline" style="display: none">
    4.         <label>
    5.             ${ID}</label>   
    6.         <label>
    7.             ${Name}</label><br />
    8.     </div>
    复制代码


    javascript:

    1.             var users = [{ ID: "think8848", Name: "Joseph Chan" }, { ID: "aCloud", Name: "Mary Cheung"}];
    2.             $("#inline").tmpl(users).appendTo("#container");
    复制代码


    效果:

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

    1.     <table cellspacing="0" cellpadding="3" border="1">
    2.         <tbody id="compileRows">
    3.         </tbody>
    4.     </table>
    复制代码


    Javascript

    1.     <script id="compile1" type="text/x-jquery-tmpl">
    2.         {{tmpl "cached"}}
    3.         <tr><td>${ID}</td><td>${Name}</td></tr>
    4.     </script>
    5.     <script id="compile2" type="type/x-jquery-tmpl">
    6.         <tr><td colspan="2">${Group}</td></tr>   
    7.     </script>
    8.     <script type="text/javascript">
    9.         $(function () {
    10.             var groupUsers = [{ ID: "think8848", Name: "Joseph Chan", Group: "Administrators" }, { ID: "aCloud", Name: "Mary Cheung", Group: "Users"}];
    11.             $("#compile2").template("cached");
    12.             $("#compile1").tmpl(groupUsers).appendTo("#compileRows");
    13.         });
    14.     </script>
    复制代码


    效果:

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

    1.             var markup = "<tr><td>${ID}</td><td>${Name}</td></tr>";
    2.             $.template("template", markup);
    3.             $.tmpl("template", users).appendTo("#templateRows");
    复制代码


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

    1.     <script id="myTemplate" type="text/x-jquery-tmpl">
    2.         <tr><td>{{= ID}}</td><td>{{= Name}}</td></tr>
    3.     </script>
    复制代码


    必须要注意的是,"="号后必须跟一个空格,不然是没有效果的。
    另外,${}中还可以放表达式,这个牛x吧,如:
    Html

    1.     <table cellspacing="0" cellpadding="3" border="1">
    2.         <tbody id="expressionRows">
    3.         </tbody>
    4.     </table>
    复制代码


    Javascript

    1.     <script type="text/javascript">
    2.         $(function () {
    3.             var userLangs = [{ ID: "think8848", Name: "Joseph Chan", Langs: ["Chinese", "English"] }, { ID: "aCloud", Name: "Mary Cheung", Langs: ["Chinese", "French"]}];
    4.             $("#expression").tmpl(userLangs).appendTo("#expressionRows");
    5.         });
    6.     </script>
    复制代码


    效果:

    jQuery .tmpl()有两个比较有用的属性:$item$data:
    $item代表当前的模板;$data代表当前的数据。
    Html

    1.     <table cellspacing="0" cellpadding="3" border="1">
    2.         <tbody id="propertyRows">
    3.         </tbody>
    4.     </table>
    复制代码


    Javascript

    1.     <script id="property" type="text/x-jquery-tmpl">
    2.         <tr><td>${ID}</td><td>${$data.Name}</td><td>${$item.getLangs("; ")}</td></tr> </script>
    3.     <script type="text/javascript">
    4.         $(function () {
    5.             var userLangs = [{ ID: "think8848", Name: "Joseph Chan", Langs: ["Chinese", "English"] }, { ID: "aCloud", Name: "Mary Cheung", Langs: ["Chinese", "French"]}];
    6.             $("#property").tmpl(userLangs, {
    7.                 getLangs: function (separator) {
    8.                     return this.data.Langs.join(separator);
    9.                 }
    10.             })
    11.             .appendTo("#propertyRows");
    12.         });
    13.     </script>
    复制代码


    效果:

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

    1.     <ul id="eachList">
    2.     </ul>
    复制代码


    Javascript

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


    效果:

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

    1.     <script id="each2" type="text/x-jquery-tmpl">
    2.           <li>ID: ${ID}; Name: ${Name};<br />Langs:<ul>[b]{{each(i,lang) Langs}}<li>${i + 1}: <label>${lang}. </label></li>{{/each}}[/b]</ul></li>
    3.     </script>
    复制代码


    作用和前一种是一样的。
    {{if}}和{{else}},这两个标签应该一看就知道作用了,直接上示例:
    Javascript

    1.     <script id="ifelse" type="text/x-jquery-tmpl">
    2.           <tr><td>${ID}</td><td>${Name}</td><td>{{if Langs.length > 1}}${Langs.join("; ")}{{else}}${Langs}{{/if}}</td></tr>
    3.     </script>
    复制代码


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

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

    1.     <script id="html" type="text/x-jquery-tmpl">
    2.           <tr><td>${ID}</td><td>${Name}</td><td>{{html Ctrl}}</td></tr>
    3.     </script>
    4.     <script type="text/javascript">
    5.         $(function () {
    6.             var ctrls = [{ ID: "think8848", Name: "Joseph Chan", Ctrl: "<input type="button" value="Demo" />" }, { ID: "aCloud", Name: "Mary Cheung", Ctrl: "<input type="text" value="Demo" />"}];
    7.             $("#html").tmpl(ctrls).appendTo("#htmlRows");
    8.         });
    9.     </script>
    复制代码


    效果:

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

    1.     <script id="tmpl1" type="text/x-jquery-tmpl">
    2.         <tr><td>${ID}</td><td>${Name}</td><td> {{tmpl($data) "#tmpl2"}}</td></tr>      
    3.     </script>
    4.     <script id="tmpl2" type="type/x-jquery-tmpl">
    5.         {{each Langs}}${$value}  {{/each}}   
    6.     </script>
    7.     <script type="text/javascript">
    8.         $(function () {
    9.             var userLangs = [{ ID: "think8848", Name: "Joseph Chan", Langs: ["Chinese", "English"] }, { ID: "aCloud", Name: "Mary Cheung", Langs: ["Chinese", "French"]}];
    10.             $("#tmpl1").tmpl(userLangs).appendTo("#tmplRows");
    11.         });
    12.     </script>
    复制代码


    效果:

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

    1.     <div id="wrapDemo">
    2.     </div>
    复制代码


    Javascript

    1.     <script id="myTmpl" type="text/x-jquery-tmpl">
    2.     The following wraps and reorders some HTML content:
    3.     {{wrap "#tableWrapper"}}
    4.         <h3>One</h3>
    5.         <div>
    6.             First <b>content</b>
    7.         </div>
    8.         <h3>Two</h3>
    9.         <div>
    10.             And <em>more</em> <b>content</b>...
    11.         </div>
    12.     {{/wrap}}
    13.     </script>
    14.     <script id="tableWrapper" type="text/x-jquery-tmpl">
    15.     <table cellspacing="0" cellpadding="3" border="1"><tbody>
    16.         <tr>
    17.             {{each $item.html("h3", true)}}
    18.                 <td>
    19.                     ${$value}
    20.                 </td>
    21.             {{/each}}
    22.         </tr>
    23.         <tr>
    24.             {{each $item.html("div")}}
    25.                 <td>
    26.                     {{html $value}}
    27.                 </td>
    28.             {{/each}}
    29.         </tr>
    30.     </tbody></table>
    31.     </script>
    32.     <script type="text/javascript">
    33.         $(function () {
    34.             $("#myTmpl").tmpl().appendTo("#wrapDemo");
    35.         });
    36.     </script>
    复制代码


    效果:

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

    1.             $("tbody").delegate("tr", "click", function () {
    2.                 var item = $.tmplItem(this);
    3.                 alert(item.data.Name);
    4.             });
    复制代码


    效果:


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










    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-4-26 12:32 , Processed in 0.473484 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表