本篇将涉及到ExtJs中一个重要的概念,模板。话说Razor很神奇,但是我个人不是很喜欢那种html混编C#的方式,仿佛又回到了asp的时代。ExtJs的模板同样也可以组织生成灵活的html,而且代码和html有效的分离。本文将细细分析ExtJs模板的用法。
行文之前我先把公共的html和用到的js数据贴在前面,后面的代码都要引用到。
[html]
01 |
<h1>使用标签tpl和操作符for</h1> |
02 |
<div class="content" id="div1"></div> |
03 |
<h1>在子模板的范围内访问父元素对象</h1> |
04 |
<div class="content" id="div2"></div> |
05 |
<h1>数组元素索引和简单运算支持</h1> |
06 |
<div class="content" id="div3"></div> |
08 |
<div class="content" id="div4"></div> |
10 |
<div class="content" id="div5"></div> |
12 |
<div class="content" id="div6"></div> |
14 |
<div class="content" id="div7"></div> |
定义data数据源:
[Js]
05 |
email: 'zhangsan@163.com', |
06 |
address: '武汉市洪山区光谷软件园', |
10 |
drinks: ['绿茶', '红酒', '咖啡'], |
一、使用标签tpl和操作符for
现在我要把data数据源展示到页面上,并组织到table里面。但是这个html不是写死的,而是通过模板生成。配合使用标签tpl和操作符for,可以循环输出张三的朋友:
[Js]
02 |
var tpl = new Ext.XTemplate( |
03 |
'<table cellpadding=0 cellspacing=0 border=1 width=400px>', |
04 |
'<tr><td colspan=2 align=center><b>{name}的个人资料</b></td></tr>', |
05 |
'<tr><td>姓名:</td><td>{name}</td></tr>', |
06 |
'<tr><td>工作:</td><td>{job}</td></tr>', |
07 |
'<tr><td>公司:</td><td>{company}</td></tr>', |
08 |
'<tr><td>地址:</td><td>{address}</td></tr>', |
09 |
'<tr><td>喜好饮品:</td><td>{drinks}</td></tr>', |
10 |
'<tr><td>他的好友:</td><td>', |
11 |
'<tpl for="friends">', |
12 |
'<p>{name}:{age}岁</p>', |
16 |
tpl.overwrite(Ext.get("div1"), data); |
查看输出效果:

二、在子模板的范围内访问父元素对象
当我们在遍历输出张三的朋友时,需要再次访问张三的信息,怎么做呢,看如下js:
[Js]
2 |
var tp2 = new Ext.XTemplate( |
4 |
'<p>{name}是{parent.name}的好友。</p>', |
7 |
tp2.overwrite(Ext.get("div2"), data); |
查看输出效果:

三、数组元素索引和简单运算支持
在循环访问数组时,可以通过{#}获取索引信息,基础数据还可以支持简单运算:
[Js]
2 |
var tp3 = new Ext.XTemplate( |
4 |
'<p>{#}、一年后,{name}的年龄是:{age+1}</p>', |
7 |
tp3.overwrite(Ext.get("div3"), data); |
查看输出效果:

四、自动渲染单根数组
通过{.}可以自动渲染没有键值对的单根数组,示例如下:
[Js]
2 |
var tp4 = new Ext.XTemplate( |
3 |
'喜好饮品:<tpl for="drinks">', |
7 |
tp4.overwrite(Ext.get("div4"), data); |
查看输出效果:

五、条件逻辑判断
配合标签tpl和操作符if的使用,可以做一些简单的逻辑判断,注意没有else操作符,你可以写两个if来代替。另外大于,小于符号要经过html编码,不能直接写出。
[Js]
02 |
var tp5 = new Ext.XTemplate( |
03 |
'<table cellpadding=0 cellspacing=0 border=1 width=400px>', |
04 |
'<tr><td>他的好友:</td><td>', |
05 |
'<tpl for="friends">', |
06 |
'<tpl if="age < 18"><p>{name}:[未成年]</p></tpl>', |
07 |
'<tpl if="age >= 18"><p>{name}:{age}岁</p></tpl>', |
11 |
tp5.overwrite("div5", data); |
查看输出效果:

六、即时执行任意的代码
在XTemplate中,{[ ... ]}范围内的内容会在模板作用域的范围下执行。这里有一些特殊的变量:
values:当前作用域下的值。若想改变其中的值,你可以切换子模板的作用域。
parent:父级模板的对象
xindex:若是循环模板,这是当前循环的索引index(从1开始)。
xcount:若是循环模板,这是循环的次数 。
[Js]
02 |
var tp6 = new
Ext.XTemplate(
|
03 |
'当前日期:{[new Date().toLocaleDateString()]}', |
04 |
'<table cellpadding=0 cellspacing=0 border=1
width=400px>',
|
05 |
'<tpl for="friends"><tr>', |
06 |
'<tpl if="xindex == 1"><td
rowspan={[xcount]}>他的好友:</td></tpl>', |
07 |
'<td>{["姓名:" + values.name + ",年龄:" + values.age +
","+ (values.like=="鲜花"?"是个女孩":"是个男孩")]}</td>', |
11 |
tp6.overwrite("div6",
data); |
查看输出效果:

七、模板成员函数
在模板中还可以调用自定义函数,这些函数通过配置传入。相关写法如下:
[Js]
02 |
var tp7 = new
Ext.XTemplate(
|
03 |
'<b>他的好友:</b><tpl
for="friends"><p>',
|
04 |
'<tpl
if="this.isWoman(like)">{name}:是个女性。</tpl>', |
05 |
'<tpl
if="this.isMen(like)">{name}:是个男性。</tpl>', |
06 |
'<tpl
if="this.isChild(age)">{name}:是个小孩。</tpl>', |
08 |
isWoman: function (like) {
|
11 |
isMen: function (like) {
|
14 |
isChild: function (age) {
|
19 |
tp7.overwrite(Ext.get("div7"), data); |