zoukankan      html  css  js  c++  java
  • 深入浅出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',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     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     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     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 锁定列
  • 相关阅读:
    android 代码上传到jcenter
    android library打包成aar形式供别的项目引用
    使用AndroidStudio导入github项目
    使用Postman在Chrome下进行rest请求测试
    Android 编码规范
    GsonFormat根据返回值json快速构建Model
    码云git使用四(分支的创建,使用和合并)
    码云git使用三(本地代码合并)
    码云git使用二(从码云git服务器上下载到本地)
    计算最长英语单词链
  • 原文地址:https://www.cnblogs.com/yizihan/p/4213887.html
Copyright © 2011-2022 走看看