在Ajax提交之后,我们一般返回的数据形式大多数都是返回的是Json 数据回来,然后结合美工提供的html把Json进行组合。
问题就出在这里,当html代码短少时,问题不大,但是一旦内容过多,那么此时问题就暴露出来了。
下面贴一张相关的代码图片,瞧瞧是如此的犀利。
此时的你是不是已经蛋疼了呢?
不管你疼不疼,我反正是疼了。gan!
先不说里面的json元素使用情况,单单是里面的双引号嵌套单引号,就让人为之疯狂了。
那么接下来,将介绍关于Jquery中一款关于HMTL模板的插件
jquery.tmpl.js --22.2KB
jquery.tmpl.min.js --5.97KB
看一个Demo
html 代码
<body>
<form id="form1" runat="server">
<div>
<ul id="ulContent">
<li>
我的ID:<label>1</label><br/>
我的年龄:<label>22</label><br/>
我的姓名:<label>abcd</label><br/>
我的性别:<label>男</label><br/>
</li>
</ul>
<br/>
<input type="button" value="测试一下" id="btnSure" />
</div>
</form>
</body>
那么进行Ajax 提交之后,返回更新的内容是 整个<li>标签的内容,所以我们将对这段<li>标签的内容进行模板化。
<script id="TemplateStudent" type="text/x-jquery-tmpl">
<li>
我的ID:<label>${Id}</label><br/>
我的年龄:<label >${Age}</label><br/>
我的姓名:<label>${Name}</label><br/>
我的性别:<label>${Sex}</label><br/>
<input type="button" value="点击我" id="btnId${Id}" onclick="fashionB(${Id});"/>
</li>
</script>
当然还有这种写法<label >{{= Age}}</label><br/> 注意=等号后面的变量名不能紧挨,否则将不能识别<br/>
还有就是对应的JS调用情况了
<script src="Scripts/jquery-1.4.1.js" type="text/javascript"></script>
<script src="Scripts/jquery.tmpl.js" type="text/javascript"></script>
<script type="text/javascript">
function fashionB(id) {
alert(id);
}
$(document).ready(function () {
$("#btnSure").click(function () {
$.post("Demo", {}, function (result, resultState) {
if (resultState == "success") {
var resultJson = eval(result);
//TemplateStudent
$("#ulContent").html($("#TemplateStudent").tmpl(resultJson));
}
});
});
});
</script>
在$("#ulContent").html($("#TemplateStudent").tmpl(resultJson));这段代码中$("#TemplateStudent")这个就是我们用Script标签包裹的html模板ID。把返回的Json数据作为参数tmpl()函数当中,剩下的事情就交给我们定义好的模板了。
(小提示,模板的里面的属性标记,必须要与你后台 类 属性一致)
大家在看模板的时候,可能已经注意到这个script标签的type属性了,text/x-jquery-tmpl ,但是我推荐大家使用这种方式 type="text/html",而不是上面那种,至于为什么,你自己动手试一下就知道了。之前的介绍,只是jquery.tmpl.js 最简单的使用方式,当然还有其他针对我们平常遇到的情况解决方案。
第二种使用方式
比如说在描述一个学生信息时,可能要把他的性别罗列出来,那么我们在设计数据库时,上面那些人如果用char类型还好,直接写入男女,但是可能是 bit 也有可能是int ,那么我们在读取之后,在组合json时,就要写if条件判断了。
我的性别:
{{if Sex==0}}
<label class='sex${colorSex(Sex)}'>男</label>
{{else}}
<label class='sex${colorSex(Sex)}'>女</label>
{{/if}}<br/>
0为男,1为女 这就是关于在模板中加入if逻辑的使用,还有就是在<label>标签中在class属性中也使用了模板标记
那么这个标记中也加入了我们js函数在配合模板使用.
Css
<style type="text/css">
.sexBoy{ color:Blue;}
.sexGirl{ color:Red;}
</style>
JS
function colorSex(sex) {
return sex == 0 ? "Boy" : "Girl";
}
这个小功能主要是区分男女颜色各不同。
第三种使用方式。
在说之前,相信大家对Jquery中的each函数不陌生,接下来我们要介绍的就是在模板中使用each
为了配合这种使用方式我们在后台类中加入一个属性,
/// <summary>
/// 我的标签
/// </summary>
public string[] Label { get; set; }
后台handler
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Script.Serialization;
/// <summary>
///DemoHander 的摘要说明
/// </summary>
public class DemoHander:IHttpHandler
{
public DemoHander()
{
//
//TODO: 在此处添加构造函数逻辑
//
}
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
IList<Student> stu = new List<Student>()
{
new Student(){ Id=1, Age=2, Sex=0, Name="嘻嘻",Label=new string[]{"y","z","a"}},
new Student(){ Id=2, Age=2,Sex=0, Name="嘻嘻",Label=new string[]{"y","z"}},
new Student(){ Id=3, Age=2,Sex=1, Name="嘻嘻",Label=new string[]{"y","z"}},
new Student(){ Id=4, Age=2, Sex=1,Name="嘻嘻",Label=new string[]{"y","z","a"}},
new Student(){ Id=5, Age=2,Sex=1, Name="嘻嘻",Label=new string[]{"y","z","a"}},
new Student(){ Id=6, Age=2,Sex=0, Name="嘻嘻",Label=new string[]{"y","z"}},
new Student(){ Id=7, Age=2,Sex=0, Name="嘻嘻",Label=new string[]{"y","z"}},
new Student(){ Id=8, Age=2, Sex=0,Name="嘻嘻",Label=new string[]{"y","z","a"}}
};
JavaScriptSerializer js = new JavaScriptSerializer();
context.Response.Write(js.Serialize(stu));
}
}
对应html模板为:
<script id="TemplateStudent" type="text/html">
<li>
我的ID:<label>${Id}</label><br/>
我的年龄:<label >{{= Age}}</label><br/> 注意=等号后面的变量名不能紧挨,否则将不能识别<br/>
我的姓名:<label>${Name}</label><br/>
我的性别:{{if Sex==0}}<label class='sex${colorSex(Sex)}'>男</label>{{else}}<label class='sex${colorSex(Sex)}'>女</label>{{/if}}<br/>
我的标签是:
{{each(indexs,values) Label}}
<label>${values} </label>
{{/each}}
一共有${Label.length}个标签<br/>
<input type="button" value="点击我" id="btnId${Id}" onclick="fashionB(${Id});"/>
</li>
</script>
这就是配合使用each的方式来做了,此时如果你已经在你的电脑上面使用了这个each,你会发现其中有点小问题,就是这几个标签会紧挨着一起,可能你会在 <label>${values} </label>后面加上一个 ,OK ,这样你认为没有问题了。看起来也很清楚了,但是可不代表其他人看起爽,让你再后面用逗号进行分割,此时你还可以接受,把 换成 , ,但是一个新的问题出来了,每个<label>标签后面,永远是多了一个逗号,此时的你,遇到这种情况的话,就要在这个each里面加上if条件判断了,就是要处理这个多了一个逗号的问题.
{{each(indexs,values) Label}}
{{if indexs!=Label.length-1}}
<label>${values}, </label>
{{else}}
<label>${values} </label>
{{/if}}
{{/each}}
一共有${Label.length}个标签<br/>
问题解决了。
第四种方式(模板复用):
我们要把这个“我的标签”部分提取出来。单独声明一个<script> 标签进行装载
<script type="text/html" id="TemplateStudent2">
我的标签是:
{{each(indexs,values) Label}}
{{if indexs!=Label.length-1}}
<label>${values}, </label>
{{else}}
<label>${values} </label>
{{/if}}
{{/each}}
一共有${Label.length}个标签<br/>
</script>
然后这里为了配合使用模板复合方式,我们要在之前的模板中改变一点点内容.
<script id="TemplateStudent" type="text/html">
<li>
我的ID:<label>${Id}</label><br/>
我的年龄:<label >{{= Age}}</label><br/> 注意=等号后面的变量名不能紧挨,否则将不能识别<br/>
我的姓名:<label>${Name}</label><br/>
我的性别:{{if Sex==0}}<label class='sex${colorSex(Sex)}'>男</label>{{else}}<label class='sex${colorSex(Sex)}'>女</label>{{/if}}<br/>
直接使用调用第二个模板,分离开来<br/>
{{tmpl '#TemplateStudent2'}}
<hr/>
<input type="button" value="点击我" id="btnId${Id}" onclick="fashionB(${Id});"/>
</li>
</script>
{{tmpl '#TemplateStudent2'}} 中的tmpl关键字,是特定的,不能随意书写。后面则加在我们提取出来的第二个模板的ID
------------------------------------------------------------------------------------------------------
除了上述四种常用方式外,还有几种使用方式。在这里我就不一一列举了,因为我介绍的只是针对于Ajax提交之后的进行组合Json来使用这个模板插件。
当然也可以单独是用这个插件,不在Ajax提交之后也可以。
此时的你,还蛋疼吗?
不管你疼不疼,反正我是不疼了。