深入浅出ExtJS 第三章 表格控件

 

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 锁定列
posted @ 2015-01-09 17:45  翌子涵  阅读(1675)  评论(0编辑  收藏  举报