ext 4.0 自定义模板

ExtJs4 笔记(4) Ext.XTemplate 模板

本篇将涉及到ExtJs中一个重要的概念,模板。话说Razor很神奇,但是我个人不是很喜欢那种html混编C#的方式,仿佛又回到了asp的时代。ExtJs的模板同样也可以组织生成灵活的html,而且代码和html有效的分离。本文将细细分析ExtJs模板的用法。

行文之前我先把公共的html和用到的js数据贴在前面,后面的代码都要引用到。

[html]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
< h1 >使用标签tpl和操作符for</ h1 >
     < div  class="content" id="div1"></ div >
< h1 >在子模板的范围内访问父元素对象</ h1 >
     < div  class="content" id="div2"></ div >
< h1 >数组元素索引和简单运算支持</ h1 >
     < div  class="content" id="div3"></ div >
< h1 >自动渲染单根数组</ h1 >
     < div  class="content" id="div4"></ div >
< h1 >条件逻辑判断</ h1 >
     < div  class="content" id="div5"></ div >
< h1 >即时执行任意的代码</ h1 >
     < div  class="content" id="div6"></ div >
< h1 >模板成员函数</ h1 >
     < div  class="content" id="div7"></ div >

定义data数据源:

[Js]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
var  data = {
     name:  '张三' ,
     job:  'C#程序员' ,
     company:  '惠普' ,
     email:  'zhangsan@163.com' ,
     address:  '武汉市洪山区光谷软件园' ,
     city:  '武汉' ,
     state:  '正常' ,
     zip:  '430000' ,
     drinks: [ '绿茶' '红酒' '咖啡' ],
     friends: [{
         name:  '李四' ,
         age: 6,
         like:  '鲜花'
     }, {
         name:  '王五' ,
         age: 26,
         like:  '足球'
     }, {
         name:  '赵六' ,
         age: 81,
         like:  '游戏'
     }]
};

一、使用标签tpl和操作符for

现在我要把data数据源展示到页面上,并组织到table里面。但是这个html不是写死的,而是通过模板生成。配合使用标签tpl和操作符for,可以循环输出张三的朋友:

[Js]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//使用标签tpl和操作符for
var  tpl =  new  Ext.XTemplate(
       '<table cellpadding=0 cellspacing=0 border=1 width=400px>' ,
       '<tr><td colspan=2 align=center><b>{name}的个人资料</b></td></tr>' ,
       '<tr><td>姓名:</td><td>{name}</td></tr>' ,
       '<tr><td>工作:</td><td>{job}</td></tr>' ,
       '<tr><td>公司:</td><td>{company}</td></tr>' ,
       '<tr><td>地址:</td><td>{address}</td></tr>' ,
       '<tr><td>喜好饮品:</td><td>{drinks}</td></tr>' ,
       '<tr><td>他的好友:</td><td>' ,
       '<tpl for="friends">' ,
       '<p>{name}:{age}岁</p>' ,
       '</tpl></td></tr>' ,
       '</table>'
);
tpl.overwrite(Ext.get( "div1" ), data);

查看输出效果:

二、在子模板的范围内访问父元素对象

当我们在遍历输出张三的朋友时,需要再次访问张三的信息,怎么做呢,看如下js:

[Js]
1
2
3
4
5
6
7
//在子模板的范围内访问父元素对象
var  tp2 =  new  Ext.XTemplate(
  '<tpl for="friends">' ,
  '<p>{name}是{parent.name}的好友。</p>' ,
   '</tpl>'
);
tp2.overwrite(Ext.get( "div2" ), data);

查看输出效果:

三、数组元素索引和简单运算支持

在循环访问数组时,可以通过{#}获取索引信息,基础数据还可以支持简单运算:

[Js]
1
2
3
4
5
6
7
//数组元素索引和简单运算支持
var  tp3 =  new  Ext.XTemplate(
  '<tpl for="friends">' ,
      '<p>{#}、一年后,{name}的年龄是:{age+1}</p>' ,
   '</tpl>'
);
tp3.overwrite(Ext.get( "div3" ), data);

查看输出效果:

四、自动渲染单根数组

通过{.}可以自动渲染没有键值对的单根数组,示例如下:

[Js]
1
2
3
4
5
6
7
//自动渲染单根数组
var  tp4 =  new  Ext.XTemplate(
  '喜好饮品:<tpl for="drinks">' ,
  ' {.}' ,
   '</tpl>'
);
tp4.overwrite(Ext.get( "div4" ), data);

查看输出效果:

五、条件逻辑判断

配合标签tpl和操作符if的使用,可以做一些简单的逻辑判断,注意没有else操作符,你可以写两个if来代替。另外大于,小于符号要经过html编码,不能直接写出。

[Js]
1
2
3
4
5
6
7
8
9
10
11
//条件逻辑判断
var  tp5 =  new  Ext.XTemplate(
  '<table cellpadding=0 cellspacing=0 border=1 width=400px>' ,
  '<tr><td>他的好友:</td><td>' ,
  '<tpl for="friends">' ,
      '<tpl if="age < 18"><p>{name}:[未成年]</p></tpl>' ,
      '<tpl if="age >= 18"><p>{name}:{age}岁</p></tpl>' ,
  '</tpl></td></tr>' ,
  '</table>'
);
tp5.overwrite( "div5" , data);

查看输出效果:

六、即时执行任意的代码

在XTemplate中,{[ ... ]}范围内的内容会在模板作用域的范围下执行。这里有一些特殊的变量: 
values:当前作用域下的值。若想改变其中的值,你可以切换子模板的作用域。 
parent:父级模板的对象 
xindex:若是循环模板,这是当前循环的索引index(从1开始)。 
xcount:若是循环模板,这是循环的次数 。

[Js]
1
2
3
4
5
6
7
8
9
10
11
//即时执行任意的代码
var  tp6 =  new  Ext.XTemplate(
  '当前日期:{[new Date().toLocaleDateString()]}' ,
  '<table cellpadding=0 cellspacing=0 border=1 width=400px>' ,
  '<tpl for="friends"><tr>' ,
      '<tpl if="xindex == 1"><td rowspan={[xcount]}>他的好友:</td></tpl>' ,
      '<td>{["姓名:" + values.name + ",年龄:" + values.age + ","+ (values.like=="鲜花"?"是个女孩":"是个男孩")]}</td>' ,
  '</tr></tpl>' ,
  '</table>'
);
tp6.overwrite( "div6" , data);

查看输出效果:

七、模板成员函数

在模板中还可以调用自定义函数,这些函数通过配置传入。相关写法如下:

[Js]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//模板成员函数
var  tp7 =  new  Ext.XTemplate(
  '<b>他的好友:</b><tpl for="friends"><p>' ,
      '<tpl if="this.isWoman(like)">{name}:是个女性。</tpl>' ,
      '<tpl if="this.isMen(like)">{name}:是个男性。</tpl>' ,
      '<tpl if="this.isChild(age)">{name}:是个小孩。</tpl>' ,
  '</p></tpl>' , {
      isWoman:  function  (like) {
          return  like ==  '鲜花' ;
      },
      isMen:  function  (like) {
          return  like !=  "鲜花" ;
      },
      isChild:  function  (age) {
          return  age < 18;
      }
  }
);
tp7.overwrite(Ext.get( "div7" ), data);

查看输出效果:


作者:李盼(Lipan)
出处: [Lipan] ( http://www.cnblogs.com/lipan/
版权声明:本文的版权归作者与博客园共有。转载时须注明本文的详细链接,否则作者将保留追究其法律责任。
分类:  JS
11
0
(请您对文章做出评价)
« 上一篇: ExtJs4 笔记(3) Ext.Ajax 对ajax的支持
» 下一篇: ExtJs4 笔记(5) Ext.Button 按钮
posted @  2011-12-12 07:40  lipan 阅读( 28386) 评论( 10编辑  收藏
  
#1楼   2011-12-12 08:58  小胖2010   
模板用过jTemplate,这个也了解过一点。
就是觉得有一点不好,不能像xsl那种有<xsl:attribute>元素,
要实现<input type='checkbox' check="根据某条件来判断">
这样就觉得不方便,必须在check里写函数,没有xsl方便。
  
#2楼 [ 楼主2011-12-12 13:56  lipan   
@ 小胖2010
可以这样写<input type='checkbox' check="{checkvalue}">
  
#3楼   2011-12-12 15:13  小强2012
楼主你好 我目前在用extjs4里面的grid 想重写一下它的键盘移动事件 但是找了挺长时间也没找到关于keydown的事件 请问你了解吗?
  
#4楼 [ 楼主2011-12-12 15:52  lipan   
@ 小强2012
其实我在第二篇已经讲到,不知道你看了没有。
下面提供两个解决方案:
1
2
3
4
5
6
7
8
9
//1
new  Ext.KeyMap(Ext.getDoc()).on(Ext.EventObject.A,  function  () {
     Ext.Msg.alert( "消息" "A键被按下。" );
});
 
//2
Ext.getDoc().on( "keydown" function  (e, o) {
     Ext.Msg.alert( "dfd" "当前按下:"  + e.getKey());
});
  
#5楼   2011-12-12 17:49  凡凡hl   
学习一下
  
#6楼   2011-12-14 00:08  圣火
楼主的每篇笔记我都在仔细的看,很好很强大,让本人受益匪浅,在此十分感谢楼主这种分享精神,让更多人与楼主分享了收获知识的喜悦,相信楼主不久必将鹏程万里、功成名就!
  
#7楼   2012-02-16 09:11  yisaka   
感谢楼主!
  
#8楼   2012-09-24 16:02  lonpo   
五:
'<tpl if="age < 18"><p>{name}:[未成年]</p></tpl>',
'<tpl if="age >= 18"><p>{name}:{age}岁</p></tpl>',
应该改成这样才是
'<tpl if="age &lt; 18"><p>{name}:[未成年]</p></tpl>',
'<tpl if="age &gt; 18 || age == 18"><p>{name}:{age}岁</p></tpl>',
  
#9楼   2013-12-07 11:08  TOGGLE   
Demo做的真是太好了,我是初学者,博主的笔记我都挨个练习了,博主是在光谷软件园工作吗?
  
#10楼   2014-05-06 12:36  幻嬛   
学习。。。。不过,楼主没有讲到关于如何图片列表显示

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值