1 3.1 表格的特性简介
2 >.Ext中的表格功能:包括排序/缓存/拖动/隐藏某一列/自动显示行号/列汇总/单元格编辑等实用功能;
3 >.表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,其xtype为grid;
4 >.表格控件必须包含列(columns)定义信息,并指定表格的数据存储器(Ext.data.Store);
1 3.2 制作一个简单的表格
2 >1.列的定义是一个JSON数组,它是整个表格的列模型,应该首先创建;
3 var columns = [
4 {header:'编号',dataIndex:'id'},
5 //每一行数据元素描述表格的一列信息; 包含首部显示文本(header),列对应的记录集字段(dataIndex);
6 {header:'名称',dataIndex:'name'},
7 {header:'描述',dataIndex:'descn'}
8 ];
9
10 >2.定义表格中要显示的数据;
11 var data = [
12 ['1','name1','descn1'],
13 ['2','name2','descn2'],
14 ['3','name3','descn3']
15 ]
16
17 >3.创建一个数据存储对象;表格必须配置的属性;负责把各种各样的原始数据(如二维数组,JSON,XML等)转换成Ext.data.Record类型的对象;
18 var store = new Ext.data.ArrayStore({
19 data:data,
20 fields:[
21 //这里定义的3个名称与columns的dataIndex相对应;将data数据与columns列模型链接;
22 {name:'id'},
23 //{name:'id',mapping:1}, //可以设置mapping来设置列的排序;
24 {name:'name'},
25 {name:'descn'}
26 ]
27 });
28 store.load(); //初始化数据;
29 //store对应两个部分:proxy(指获取数据的方式)和render(指如何解析这一堆数据);
30
31 >4.创建表格
32 var grid = new Ext.grid.GridPanel({
33 autoHeight:true,
34 renderTo:'grid', //指示Ext将表格渲染到什么地方;
35 store:store,
36 columns:columns
37 })
1 3.3 表格常用功能
2 3.3.1 部分属性功能
3 >1.enableColumnMove 拖放移动列;
4 >2.enableColumnResize 改变列宽;
5 >3.stripeRows 斑马线效果;
6 >4.loadMask 显示"Loading..."
7
8 3.3.2 自主决定每列的宽度
9 //每列默认是100px;
10 >1.自定义列宽
11 var columns = [
12 {header:'编号',dataIndex:'id',width:200}
13 ]
14 >2.forceFit
15 var grid = new Ext.grid.GiidPanel({
16 renderTo:'grid',
17 forceFit:true //让每列自适应填满表格;
18 });
19
20 3.3.3 sortable表格列排序
21 var columns = new Ext.grid.ColumnModel([
22 {header:'编号',dataIndex:'id',sortable:true}
23 ])
24 //Ascending:正序; Descending:倒序;
25
26 3.3.4 中文排序
27
28 3.3.5 显示日期类型数据
29 //Ext可以从后台取得日期类型的数据,交给表格进行格式化;
30 var columns = [{header:'日期',dataIndex:'date',renderer:Ext.util.Format.dateRenderer('Y-m-d')}];
31 //renderer的属性值就是Ext提供的日期格式化方法;
32 var data = [['1','name1','descn1','1970-01-15T02:58:04']]
33 var store = new Ext.data.ArrayStore({
34 data:data,
35 fields:[{name:'date',type:'date',dateFormat:'Y-m-dTH:i:s'}]
36 //type属性告诉ExtJS解析数据时按日期类型处理;
37 //dateFormat:将数据中的字符串格式转换成日期格式;
38 });
1 3.4 表格渲染
2 >1.修改文字颜色样式和添加图片;
3 function renderSex(value){
4 if(value == 'male'){
5 return "<span style='color:red; font-weight:bold'>红男</span><img src="user_male.png" />";
6 }else{
7 return "<span style='color:green, font-weight:bold'>绿女</span><img src="user_female.png" />";
8 };
9 //在返回value之前,拼装上相应的HTML和CSS即可;
10 };
11 var columns = [{header:'性别',dataIndex:'sex',renderer:renderSex}];
12 //renderer的值是一个自定义函数;
13 >2.其他可用参数
14 function renderDescn(value, cellmeta, record, rowIndex, columnIndex, store){
15 var str = value+cellmeta+record+rowIndex+columnIndex+store;
16 return str;
17 }
18 //value:将要显示到单元格的值;
19 //cellmeta:单元格的属性,主要有id和CSS;
20 //record:所在行的数据对象;
21 //rowIndex:所在行行号;
22 //columnIndex:所在列列号;
23 //store:构造表格传递的ds;
1 3.5 给表格的行和列设置颜色
2 <style>.yellow-row{ background-color: #FBF8BF !important; }</style>
3 Ext.onReady(function(){
4
5 var data = [['boy',0,'#fbf8bf']]; //表格数据;
6
7 var store = new Ext.data.ArraySotre({ //数据存储对象;
8 data:data, //引入表格数据; 并将数据转换成Ext.data.Record类型的对象;
9 fields:[ //与columns参数对应;
10 {name:'name',type:'string'},
11 {name:'sex',type:'int'},
12 {name:'color',type:'string'}
13 ]
14 });
15 store.load(); //初始化数据;
16
17 var grid = new Ext.grid.GridPanel({
18 store:store, //引入record数据对象;
19 columns:[ //创建列模型;
20 {header:'name',dataIndex:'name'},
21 {header:'sex',dataIndex:'sex'}
22 ],
23 renderTo:'grid',
24 viewConfig:{
25 enableRowBody:true,
26 getRowClass:function(record,rowIndex,p,ds){
27 var cls = 'white-row'; //默认是白色;
28 switch(record.data.color){ //先查找record对象即store,再查找data属性,再查找到color在data里对应的值;
29 case '#fbf8bf': //匹配值,设置class名;
30 cls = "yellow-row"
31 break;
32 }
33 return cls;
34 }
35 }
36 });
37 });
1 3.6 自动显示行号和复选框
2 3.6.1 自动显示行号
3 var columns = [
4 new Ext.grid.RowNmuberer(),
5 //在列模型中加入RowNumberer对象,
6 {header:'姓名',dataIndex:'name'}
7 ]
8 >.删除行/刷新表格
9 Ext.get('remove').on('click',function(){
10 store.remove(store.getAt(0)); //删除第一条数据;
11 grid.view.refresh(); //刷新视图重新加载store,并重新渲染模板的数据;
12 })
13
14 3.6.2 复选框
15 var sm = new Ext.selection.CheckboxModel({checkOnly:true});
16 //CheckboxModel会在每行数据前添加一个复选框;
17 //checkOnly属性表示是否可以通过选中行进行选取,还是必须选中复选框选取;
18 var grid = new Ext.grid.GridPanel({
19 ...,
20 selModel:sm
21 //selModel在总体上控制用户对表格的选择功能;
22 })
1 3.7 选择模型
2 >1.RowModel(行选择模型)
3 //在定义Ext.grid.GridPanel时,默认使用RowModel--行选择模型;
4 var grid = new Ext.grid.GridPanel({
5 ...,
6 sm:new Ext.grid.RowModel({singleSelect:true}) //设置只能选中一行;
7 })
8 >2.CellModel(单元格选择模型)
9 //在EditorGrid里默认使用CellModel;
10 >3.选中行信息显示
11 grid.on('itemclick',function(){
12 //表格绑定单机事件;
13 var selected = grid.getSelectionModel().selected; //gSM():返回正在使用的选择模型 selected:所有当前已选择的记录的混合集合
14 for(var i=0; i<selected.getCount(); i++){
15 var record = selected.get(i);
16 Ext.Msg.alert('提示',record.get("id")+","+record.get("name")+","+record.get("descn"));
17 }
18 })
1 3.8 表格视图--Ext.grid.GridView
2 //表格控件都遵循MVC模型
3 //Ext.data.Store:可看做模型(Model);
4 //Ext.grid.GridPanel:设置的各种监听器可看做控制器(Controller);
5 //Ext.grid.GridView:对应的就是视图(View);
6 //通常情况下不需要自行创建Ext.grid.GridView的实例,Ext.grid.GridPanel会自动生成对应的实例,使用默认的样式将表格显示到页面上;
7 //若希望操作Ext.grid.GridView的属性时,可以通过Ext.grid.GridPanel的getView()函数来获取当前表格使用的视图实例;
8 //与GridView相关的操作都集中在视图的显示功能部分;grid.getView()必须在创建Ext.grid.GridPanel之后调用,它只能获得Ext.grid.GridPanel中创建好的GridView实例;
9 //可以使用Ext.grid.GridPanel的viewConfig参数,在创建GridView时设置一些初始参数;
10 var grid = new Ext.grid.GridPanel({ //控制器Controller;
11 store:new Ext.data.ArrayStore({ //模型Model;
12 data:data,
13 fields:meta,
14 autoLoad:true
15 }),
16 columns:meta,
17 renderTo:'grid', //GridPanel自动创建对应的实例,即视图View;
18 width:450,
19 height:80,
20 viewConfig:{ //为创建的GridView设置初始参数;
21 columnsText:'显示的列', //中文显示;
22 scrollOffset:30, //滚动条的宽度,默认是20px;
23 sortAscText:'升序',
24 sortDescText:'降序',
25 forceFit:true //自适应列宽;
26 }
27 });
1 3.9 表格分页
2 3.9.1 为表格添加分页工具条
3 var grid = new Ext.grid.GridPanel({
4 renderTo:'grid',
5 autoHeight:true,
6 store:store,
7 columns:columns,
8 bbar:new Ext.PagingToolvar({
9 pageSize:10, //每页显示几条数据;
10 store:store,
11 displayInfo:true, //是否显示数据信息;
12 displayMsg:'显示第{0}条到{1}条记录,一共{2}条',
13 //用来显示有数据时的提示信息;
14 emptyMsg:'没有记录' //没有记录时显示的信息;
15 })
16 });
17 store.load(); //必须在构造表格以后执行,否则分页工具条将不起作用;
18 //将分页工具条和store相关联,从而实现与表格共享数据模型;
19
20 3.9.2 通过后台脚本获得分页数据
21 var columns = [{header:'编号',dataIndex:'id'}]
22
23 var store = new Ext.data.Store({
24 //Store:仓库/存储;它封装了一个客户端缓存,用于存储Model对象;Store通过一个代理Proxy来加载数据,并提供函数来排序/过滤以及查询内部所包含的model实例;
25 //而Ext.data.ArrayStore是一个小巧的帮助类,更方便的从一个数组的数据来创建Ext.data.Store;
26 proxy:{ //换掉proxy,不再到内存中查找,而是通过HTTP获得想要的数据;
27 type:'ajax', //表示使用Ajax向后台请求数据;
28 url:'xxx.jsp', //请求地址;
29 reader:{ //不再是解析简单的数组,而是后台传过来的JsonReader,
30 type:'json', //所以reader设置type为json;
31 totalProperty:'totalProperty',//对应JSP中的代码,数据的总数;
32 root:'root', //JSP中的数据数组;
33 idProperty:'id'
34 }
35 },
36 fields:[
37 {name:'id'},
38 {name:'name'},
39 {name:'descn'}
40 ]
41 });
42
43 var grid = new Ext.grid.GridPanel({...(分页代码)});
44 store.load({params:{start:0,limit:10}}); //在初始化时通过传递对应的分页参数去获取希望得到的数据;
45
46 3.9.3 分页工具条在表格顶部
47 var grid = new Ext.grid.GridPanel({
48 ...
49 tbar:new Ext.PagingToolvar({...}) //tbar:顶部工具条;bbar:底部工具条;
50 });
51
52 3.9.4 Ext前台分页
53 //需要引用PagingMemoryProxy.js,从本地数组读取数据,实现内存分页;
1 3.10 后台排序
2 //把排序信息提交到后台,由后台排序信息组装到SQL里;然后再由后台将处理好的数据返回给前台;
3 var store = new Ext.data.Store({
4 proxy:{...},
5 fields:[...],
6 remoteSort:true //是否允许远程排序,默认值是false;
7 //向后台提交两个参数:sort(要排序的字段)和dir(升序或降序);
8 });
1 3.11 多重排序
2 //对"Rating"和"Salary"两列进行排序;
3 store.sort([{
4 property:'rating',
5 direction:'DESC'
6 },{
7 property:'salary',
8 direction:'ASC'
9 }]);
1 3.12 可编辑表格控件--EditorGrid
2 3.12.1 制作一个EditorGrid;
3 var columns = [{header:'编号',dataIndex:'id',
4 editor:{allowBlank:false}}] //表格不能为空;
5 //为每列添加了TextField插件;
6
7 var grid = new Ext.grid.GridPanel({
8 columns:columns,
9 store:store,
10 selType:'cellmodel', //设置选择模型为单元格模型;默认是:rowmodel;行模型;
11 plugins:[
12 Ext.create('Ext.grid.plugin.CellEditing',{ //启用CellEditing插件;
13 clidksToEdit:1 //设置单击激活编辑器; 默认双击;
14 })
15 ]
16 });
17
18 3.12.2 添加一行数据
19 var grid = new Ext.grid.GridPanel({
20 autoHeight:true,
21 renderTo:'grid',
22 store:store,
23 columns:columns,
24 selType:'cellmodel',
25 plugins:[
26 Ext.create('Ext.grid.plugin.CellEditing',{
27 clicksToEdit:1
28 })
29 ],
30 tbar:['-',{ //创建顶部工具条; '-':在页面显示'|';
31 text:'添加一行', //按钮显示值;
32 handler:function(){ //定义按钮按下时执行的函数;
33 var p = {
34 id:'',name:'',descn:''//新添加的行对应的列属性;
35 };
36 store.insert(0,p); //在第一行的上面添加一个新行;
37 }
38 },'-',{
39 text:'删除一行',
40 handler:function(){
41 Ext.Msg.confirm('信息','确定要删除?',function(btn){
42 //弹出确认窗口;
43 if(btn == 'yes'){ //用户选中"yes";
44 var sm = grid.getSelectionModel(); //定位选中单元格对象;
45 var record = sm.getSelection()[0]; //单元格对应的行模型;
46 store.remove(record); //删除对应行;
47 }
48 })
49 };
50 },'-']
51 });
52
53 3.12.3 保存修改结果
54 接上..,'=',{
55 text:'保存', //添加保存按钮;
56 handler:function(){
57 var m = store.getModifiedRecrods().slice(0);
58 //从Store(数据存储对象)获得所有record(表格行对象);
59 var jsonArray = [];
60 Ext.each(m,function(item){
61 //遍历m数组,并对其中每个元素调用fn函数;
62 jsonArray.push(item.data);
63 });
64
65 Ext.Ajax.request({
66 method:'POST',
67 url:'xxx.jsp',
68 success:function(response){
69 Ext.Msg.alert("信息",response.responseText,function(){
70 store.reload();
71 })
72 },
73 failure:function(){
74 Ext.Msg.alert("错误","与后台连接出现问题");
75 },
76 params:'data='+encodeURIComponent(Ext.encode(jsonArray))
77 });
78 }
79 }
80
81 3.12.4 限制输入数据的类型
82 var comboData = [
83 [0,'新版ext教程'],
84 [1,'ext在线支持'],
85 [2,'ext扩展']
86 ];
87 //数据部分单独抽离出来,为了在editor和renderer里保持数据同步;
88 var columns = [{
89 header:'数字列',
90 dataIndex:'number',
91 editor:new Ext.form.NumberField({
92 allowBlank:false, //不为空;
93 allowNegative:false, //不为负数;
94 maxValue:10 //最长10位;
95 })
96 },{
97 header:'选择列',
98 dataIndex:'combo',
99 editor:new Ext.form.ComboBox({
100 //传统的<input>和<select>域的综合;用户可以自由的在域中键入;
101 store:new Ext.data.SimpleStore({
102 fields:['value','text'], //绑定模型的字段;
103 data:comboData //读写数据comboData;
104 }),
105 emptyText:'请选择',
106 mode:'local',
107 triggerAction:'all', //触发器被点击时的操作;
108 valueField:'value', //相关的数据值绑定到ComboBox;
109 displayField:'text',
110 editable:false //只读模式;
111 }),
112 renderer:function(value){ //渲染函数;
113 return comboData[value][1];//返回comboData数组里的text值;
114 }
115 },{
116 header:'日期列',
117 dataIndex:'data',
118 editor:new Ext.form.DateField({
119 //提供一个带有日期选择器(picker)下拉框并会自动进行日期验证的日期输入表单项;
120 format:'Y-m-d', //日期格式;
121 minValue:'2007-12-14', //日期最小值;
122 disabledDays:[0,6], //禁止选择的日期;
123 disabledDaysText:'只能选择工作日'
124 }),
125 renderer:function(value){
126 return Ext.Date.format(value,'Y-m-d');
127 //返回格式化的日期字符串;
128 }
129 },{
130 header:'判断列',
131 dataIndex:'check',
132 editor:new Ext.form.Checkbox({
133 allowBlank:false
134 }),
135 renderer:function(value){
136 return value ? '是' : '否';
137 }
138 }];
1 3.13 表格属性控件--PropertyGrid
2 3.13.1 简介
3 //PropertyGrid(属性表格)扩展自EditGrid,可以直接编辑右边的内容;
4 var grid = new Ext.grid.PropertyGrid({
5 title:'属性表格', //表格标题;
6 autoHeight:true, //自适应高度;
7 width:300,
8 renderTo:'grid',
9 viewConfig:{ //初始化设置表格属性;
10 forceFit:true //表格列自适应;
11 },
12 source:{ //JSON数据,指定了表格里的key和value;
13 "名字":"不说", //string对应TextField编辑器;
14 "创建时间":new Date(Date.parse('12/15/2014')), //date对应DateField编辑器;
15 "是否有效":false, //bool对应ComboBox编辑器(下拉列表);
16 "版本号":.02, //number对应NumberField编辑器;
17 }
18 });
19
20 3.13.2 只读表格
21 //PropertyGrid没有直接关闭编辑功能的属性;可以通过Ext的事件监听器实现;
22 grid.on("beforeedit",function(e){
23 e.cancel = true;
24 return false;
25 });
1 3.14 分组表格控件--GroupingGrid
2 var meta = [
3 {header:'index',dataIndex:'id',name:'id'}
4 {header:'sex',dataIndex:'sex',name:'sex'}
5 {header:'name',dataIndex:'name',name:'name'}
6 {header:'descn',dataIndex:'descn',name:'descn'}
7 ]
8 var data = [
9 ['1','male','name1','descn1']
10 ['2','female','neme2','descn2']
11 ]
12 var grid = new Ext.grid.GridPanel({
13 store:new Ext.data.ArrayStore({ //数据存储器;
14 fields:meta,
15 data:data,
16 groupField:'sex', //需要分组的域;分组行;
17 sortInfo:{field:'id',direction:'ASC'} //排序列;
18 }),
19 columns:meat,
20 features:[{ftype:'grouping'}], //分组设置;!!!
21 renderTo:'grid',
22 autoHeight:true
23 });
24
25 Ext.get('expand').on('click',function(){
26 grid.view.features[0].expandAll(); //展开所有分组;
27 });
28 Ext.get('collapse').on('click',function(){
29 grid.view.features[0].collapseAll();//折叠所有分组;
30 });
31 Ext.get('one').on('click',function(){ //先判断再操作;
32 var feature = grid.view.features[0];//获得feature的实例;
33 if(feature.isExpanded('female')){
34 feature.expand('female');
35 feature.collapse('female');
36 }else{
37 feature.collapse('female');
38 feature.expand('female');
39 }
40 });
1 3.15 可拖拽的表格
2 3.15.1 拖放改变表格的大小
3 var rz = new Ext.Resizable(grid.getE1(),{ //放在render之后;
4 wrap:true, //在构造Resizable()函数时,自动在指定id的外边包裹一层div
5 minHeight:100,
6 pinned:true, //可拖拽提示,一直显示在表格下边;
7 handles:'s' //下边可拖拽;
8 });
9 rz.on('resize',function(resizer,width,height,event){
10 grid.setHeight(height);
11 //在拖拽完成之后,调用setHeight()方法修改自己的大小;
12 })
13
14 3.15.2 在同一个表格里拖放
15 var grid = new Ext.grid.GridPanel({
16 renderTo:'grid',store:store,coluns:columns,
17 viewConfig:{
18 plugins:{ //提供了插件的注册表,通过ptype助记码来编入索引;
19 ptype:'gridviewdragdrop'
20 }
21 }
22 });
23
24 3.15.3 表格之间的拖放
25 //两个表格都设置了gridviewdragdrop插件,即可互相拖放;
26 var grid1 = new Ext.grid.GridPanel({
27 ..
28 viewConfig:{
29 plugins:{ptype:'gridviewdragdrop'}
30 }
31 });
32 var grid2 = new Ext.grid.GridPanel({
33 ..
34 viewConfig:{
35 plugins:{ptype:'gridviewdragdrop'}
36 }
37 });
1 3.16 表格与右键菜单
2 var contextmenu = new Ext.menu.Menu({
3 id:'theContextMenu',
4 items:[{
5 text:'查看详情',
6 handler:function(){..}//右键函数;
7 }]
8 });
9 grid.on('itemcontextmeun',function(view,record,item,index,e){
10 e.preventDefault(); //e:事件对象; 禁止浏览器默认右键菜单;
11 contextmenu.showAt(e.getXY()); //显示自定义右键菜单;
12 });
1 3.17 基于表格的扩展插件
2 3.17.1 行编辑器
3 columns:[{
4 header:'Email',
5 dataIndex:'email',
6 width:160,
7 editor:{
8 xtype:'textfield', //替代全类型创建对象;
9 allowBlank:false,
10 vtype:'email'
11 }
12 }]
13 plugins:[rowEditing], //行编辑器控件;
14
15 3.17.2 进度条分页组件
16 3.17.3 缓冲式表格视图
17 3.17.4 分组表头
18 var grid = Ext.create('Ext.grid.Panel',{
19 columnLines:true,
20 columns:[{
21 text:'Company',
22 flex:1,
23 sortable:false,
24 dataIndex:'company'
25 },{
26 text:'Stock Price',
27 columns:[{
28 text:'Price',
29 renderer:'usMoney',
30 dataIndex:'price'
31 },{
32 text:'Change',
33 renderer:change,
34 dataIndex:'change'
35 }]
36 }]
37 });
38 3.17.5 锁定列