• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    JavaScript的ExtJS框架中表格的编写教程

    发布者: 琛瑞6678 | 发布时间: 2025-8-13 21:57| 查看数: 83| 评论数: 0|帖子模式

    ExtJS中表格的特性简介
    表格由类Ext.grid.GridPanel定义,继承自Ext.Panel,xtype为grid
    表格的列信息由Ext.grid.ColumnModel定义
    表格的数据存储器由Ext.data.Store定义,根据解析数据的不同,数据存储器可具体分为如下几种:
    JsonStore,SimpleStore,GroupingStore…
    一个表格的基本编写过程:
    1、创建表格列模型
    1. var cm = new Ext.grid.ColumnModel({
    2. {header: '角色', dataIndex: 'role'},
    3. {header: '等级', dataIndex: 'grade'},
    4. {header: '创建日期', dataIndex: 'createDate', type: 'date', renderer: Ext.util.Format.dateRenderer('Y年m月d日')} //创建日期类型的数据
    5. });
    复制代码
    2、创建数据数组
    1. var data = [
    2.   ['士兵','7','2011-07-2412:34:56'],
    3.   ['将军','10','2011-07-2412:34:56'],
    4. ];
    复制代码
    3、创建一个数据存储对象store,包含两部分:proxy,获取数据的方式;reader,解析数据的方式
    ArrayReader的mapping用来设置列的排列顺序
    1. var store = new Ext.data.Store({
    2.   proxy: new Ext.data.MemoryProxy(data),
    3.   reader: new Ext.data.ArrayReader({}, [
    4.     {name: 'role', mapping: 1},
    5.     {name: 'grade', mapping: 0}
    6.     {name: 'createDate', mapping: 2, type:'date', dateFormat:'Y-m-dH:i:s'} //创建日期列和显示格式
    7.   ])
    8. });
    9. store.load();
    复制代码
    4、创建GridPanel,装配ColumnModel和store
    1. var grid = new Ext.grid.GridPanel({
    2. renderTo: 'grid',
    3. store: store,
    4. cm: cm
    5. });
    复制代码
    另外获取远程数据可以使用ScriptTagProxy,如下所示
    1. var store = new Ext.data.Store({
    2.   proxy: new Ext.data.ScriptTagProxy({
    3.    url:'http://...'}),
    4.   reader: new Ext.data.ArrayReader({}, [
    5.     {name: 'role', mapping: 1},
    6.     {name: 'grade', mapping: 0}
    7.   ]),
    8.   sortInfo: {field: "role", direction: "ASC"} //设置默认排序列,ASC/DESC
    9. });
    复制代码

    表格的常用属性功能
    1. var grid = new Ext.grid.GridPanel({
    2. enableColumnMove: false, //禁止拖放列
    3. enableColumnResize: false, //禁止改变列的宽度
    4. stripeRows: true, //斑马线效果
    5. loadMask: true, //读取数据时的遮罩和提示功能
    6. renderTo: 'grid',
    7. store: store
    8. cm: cm
    9. });

    10. var cm = new Ext.grid.ColumnModel({
    11. {header: '角色', dataIndex: 'role', width:90, sortable: true}, //width设置列宽度,默认为100px,sortable设置排序功能
    12. {id:'grade', header: '等级', dataIndex: 'grade', width:40}
    13. });
    14. var grid = new Ext.grid.GridPanel({
    15. renderTo: 'grid',
    16. store: store,
    17. cm: cm
    18. viewConfig:{  //让每列自动填充满表格
    19. forceFit: true
    20. }
    21. autoExpandColumn: 'grade' //自动延伸列,列的id在ColumnModel中定义
    22. });
    复制代码
    渲染表格,为表格设置特殊样式
    只需要在cm里面增加一个renderer属性,添加一个自定义函数来渲染传进来(由EXT自动传递)的参数的样式即可,即在返回value之前拼装上相应的HTML和CSS或者JS响应事件。
    1. function renderSex(value) {
    2.   if (value == 'male') {
    3.     return "<span style='color:blue;'>男</span><img src='images/icon_male.png' />";
    4.   } else {
    5.     return "<span style='color:red;'>女</span><img src='images/icon_female.png' />";
    6.   }
    7. }

    8. var cm = new Ext.grid.ColumnModel([
    9.   {header:'id',dataIndex:'id'},
    10.   {header:'name',dataIndex:'name'},
    11.   {header:'sex',dataIndex:'sex',renderer:renderSex},
    12. ]);

    13. var data = [
    14.   ['1','Jason','male'],
    15.   ['2','Kate','female']
    16. ];

    17. var store = new Ext.data.Store({
    18.   proxy: new Ext.data.MemoryProxy(data),
    19.   reader: new Ext.data.ArrayReader({}, [
    20.     {name: 'id'},
    21.     {name: 'name'},
    22.     {name: 'sex'}
    23.   ])
    24. });
    25. store.load();

    26. var grid = new Ext.grid.GridPanel({
    27.   autoHeight: true,
    28.   renderTo: 'grid',
    29.   store: store,
    30.   cm: cm
    31. });
    复制代码
    自动显示行号,只要在创建cm时创建一个RowNumberer就可以了
    1. var cm = new Ext.grid.ColumnModel([
    2. new Ext.grid.RowNumberer(),  //显示行号
    3.   {header:'id',dataIndex:'id'},
    4.   {header:'name',dataIndex:'name'},
    5.   {header:'sex',dataIndex:'sex',renderer:renderSex},
    6. ]);
    复制代码
    删除列
    1. store.remove(store.getAt(i));
    复制代码
    刷新表格
    1. grid.view.refresh();
    复制代码
    为表格添加复选框
    需要使用CheckboxSelectionModel
    SelectionModel sm在使用时要放到cm和表格中
    1. var sm = new Ext.grid.CheckboxSelectionModel();

    2. var cm = new Ext.grid.ColumnModel([
    3.   new Ext.grid.RowNumberer(),
    4.   sm,
    5.   {header:'编号',dataIndex:'id'},
    6.   {header:'名称',dataIndex:'name'}
    7. ]);

    8. var data = [
    9.   ['1','name1'],
    10.   ['2','name2']
    11. ];

    12. var store = new Ext.data.Store({
    13.   proxy: new Ext.data.MemoryProxy(data),
    14.   reader: new Ext.data.ArrayReader({}, [
    15.     {name: 'id'},
    16.     {name: 'name'}
    17.   ])

    18. });
    19. store.load();

    20. var grid = new Ext.grid.GridPanel({
    21.   autoHeight: true,
    22.   renderTo: 'grid',
    23.   store: store,
    24.   cm: cm,
    25.   sm: sm
    26. });
    复制代码
    通过RowSelectionModel设置只选择一行:
    1. var grid = new Ext.grid.GridPanel({
    2.   autoHeight: true,
    3.   renderTo: 'grid',
    4.   store: store,
    5.   cm: cm,
    6.   sm: new Ext.grid.RowSelectionModel({singleSelect:true})
    7. });
    复制代码
    使用选择模型获取数据
    1. grid.on('click', function() {
    2.   var selections = grid.getSelectionModel().getSelections();
    3.   for (var i = 0; i < selections.length; i++) {
    4.     var record = selections[i];
    5.     Ext.Msg.alert(record.get("id"));
    6.   }
    7. });
    复制代码
    表格视图
    从MVC的思想来看表格控件:
    * Ext.data.Store可看做模型
    * Ext.grid.GridPanel可看做控制器
    * Ext.grid.GridView可看做视图
    * 一般GridView由GridPanell自动生成,如果想设置GridView的属性时,可以通过Ext.grid.GridPanel的getView()获得视图实例
    1. Ext.get('button1').on('click', function() {
    2. grid.getView().scrollToTop();
    3.   grid.getView().focusCell(0, 0);
    4.   var cell = grid.getView().getCell(0, 0);
    5.   cell.style.backgroundColor = 'red';
    6. });
    复制代码
    使用GridPanel的viewConfig在创建表格时设置GridView的初始化参数
    1. var grid = new Ext.grid.GridPanel({
    2.   height: 100,
    3.   width: 400,
    4.   renderTo: 'grid',
    5.   store: new Ext.data.Store({
    6.     autoLoad: true,
    7.     proxy: new Ext.data.MemoryProxy(data),
    8.     reader: new Ext.data.ArrayReader({}, meta)
    9.   }),
    10.   columns: meta,
    11.   viewConfig: {
    12.     columnsText: '显示的列', //设置下拉菜单提示文字
    13.     scrollOffset: 30,  //设置右侧滚动条的预留宽度
    14.     sortAscText: '升序',  //设置下拉菜单提示文字
    15.     sortDescText: '降序',  //设置下拉菜单提示文字
    16.     forceFit: true  //自动延展每列的长度
    17.   }
    18. });
    复制代码
    为表格添加分页工具条
    * 可以使用GridPanel的bbar属性,并创建Ext.PagingToolbar分页工具条对象
    * 注意,如果配置了分页工具条,store.load()就必须在构造表格以后执行。
    1. var grid = new Ext.grid.GridPanel({
    2.   renderTo: 'grid',
    3.   autoHeight: true,
    4.   store: store,
    5.   cm: cm,
    6.   bbar: new Ext.PagingToolbar({
    7.     pageSize: 10,  //每页显示10条数据
    8.     store: store,
    9.     displayInfo: true,  //显示数据信息
    10.     displayMsg: '显示第 {0} 条到 {1} 条记录,一共 {2} 条',
    11.     emptyMsg: "没有记录"  //没有数据时显示的信息
    12.   })
    13. });
    14. store.load();
    复制代码
    从后台脚本获取分页数据
    使用HttpProxy传递请求,获取服务器的JSON数据,交给JsonReader解析
    1. var cm = new Ext.grid.ColumnModel([
    2.   {header:'编号',dataIndex:'id'},
    3.   {header:'名称',dataIndex:'name'}
    4. ]);
    5. var store = new Ext.data.Store({
    6.   proxy: new Ext.data.HttpProxy({url:'page.jsp'}),
    7.   reader: new Ext.data.JsonReader({
    8.     totalProperty: 'totalProperty',
    9.     root: 'root'
    10.   }, [
    11.     {name: 'id'},
    12.     {name: 'name'}
    13.   ])
    14. });
    15. var grid = new Ext.grid.GridPanel({
    16.   renderTo: 'grid',
    17.   autoHeight: true,  //数据传回来之前高度未知,所以要使用自适应高度
    18.   store: store,
    19.   cm: cm,
    20.   bbar: new Ext.PagingToolbar({
    21.     pageSize: 10,
    22.     store: store,
    23.     displayInfo: true,
    24.     displayMsg: '显示第 {0} 条到 {1} 条记录 / 共 {2} 条',
    25.     emptyMsg: "没有记录"
    26.   })
    27. });
    28. store.load({params:{start:0,limit:10}});
    复制代码
    如果想让分页工具条显示在表格的顶部,可以使用GridPanel的tbar属性设置添加工具条
    让ExtJS在对返回的数据进行分页
    * 需要在页面中引入examples/locale目录下的PagingMemoryProxy.js文件
    * 再使用PagingMemoryProxy设置代理
    1. var store = new Ext.data.Store({
    2.   proxy: new Ext.data.PagingMemoryProxy(data),
    3.   reader: new Ext.data.ArrayReader({}, [
    4.     {name: 'id'},
    5.     {name: 'name'},
    6.     {name: 'descn'}
    7.   ])
    8. });
    9. //在创建GridPanel之后调用
    10. store.load({params:{start:0,limit:3}});
    复制代码
    可编辑表格控件EditorGrid的使用
    制作一个简单的EditorGrid的步骤:
    1、定义列ColumnModel,在里面添加editor属性
    1. var cm = new Ext.grid.ColumnModel([{
    2.   header: '编号',
    3.   dataIndex: 'id',
    4.   editor: new Ext.grid.GridEditor(
    5.     new Ext.form.TextField({
    6.       allowBlank: false //不允许在TextField中输入空值
    7.     })
    8.   )
    9. }, {
    10.   header: '名称',
    11.   dataIndex: 'name',
    12.   editor: new Ext.grid.GridEditor(
    13.     new Ext.form.TextField({
    14.       allowBlank: false
    15.     })
    16.   )
    17. }]);
    复制代码
    2、准备一个数组
    1. var data = [
    2.   ['1','Jason'],
    3.   ['2','Jay']
    4. ];
    复制代码
    3、创建Ext.data.Store,设置内存代理,设置ArrayReader解析数组
    1. var store = new Ext.data.Store({
    2.   proxy: new Ext.data.MemoryProxy(data),
    3.   reader: new Ext.data.ArrayReader({}, [
    4.     {name: 'id'},
    5.     {name: 'name'}
    6.   ])
    7. });
    复制代码
    4、加载数据,创建EditorGridPanel
    1. store.load();
    2. var grid = new Ext.grid.EditorGridPanel({
    3.   autoHeight: true,
    4.   renderTo: 'grid',
    5.   store: store,
    6.   cm: cm
    7. });
    复制代码
    为可编辑表格添加和删除数据
    1、使用Record的create方法创建一个记录集MyRecord,MyRecord相当于一个类
    1. var MyRecord = Ext.data.Record.create([
    2.   {name: 'id', type: 'string'},
    3.   {name: 'name', type: 'string'}
    4. ]);
    5. store.load();
    复制代码
    2、创建EditorGridPanel面板,在属性tbar中创建Ext.Toolbar
    1. var grid = new Ext.grid.EditorGridPanel({
    2.   autoHeight: true,
    3.   renderTo: 'grid',
    4.   store: store,
    5.   cm: cm,
    6.   tbar: new Ext.Toolbar(['-', { //-表示菜单分隔符
    7.     text: '添加一行',
    8.     handler: function(){
    9.       var p = new MyRecord({
    10.         id:'',
    11.         name:''
    12.       });
    13.       grid.stopEditing(); //关闭表格的编辑状态
    14.       store.insert(0, p); //创建的Record插入store的第一行
    15.       grid.startEditing(0, 0); //激活第一行第一列的编辑状态
    16.     }
    17.   }, '-', {
    18.     text: '删除一行',
    19.     handler: function(){
    20.       Ext.Msg.confirm('信息', '确定要删除?', function(btn){
    21.         if (btn == 'yes') {
    22.           var sm = grid.getSelectionModel(); //获取表格的选择模型
    23.           var cell = sm.getSelectedCell();  //获取选中的单元格
    24.           var record = store.getAt(cell[0]); //通过行号得到store这一行对应的Record
    25.           store.remove(record);  //移除数据
    26.         }
    27.       });
    28.     }
    29.   }, '-'])
    30. });
    复制代码
    为可编辑表格保存修改的结果
    在上面例子的基础之上,添加一个保存按钮
    1. text: '保存',
    2. handler: function(){
    3.   var m = store.modified.slice(0); //获得store中修改过得数据
    4.   for (var i = 0; i < m.length; i++) { //验证表格信息是否正确,是否包含空格
    5.     var record = m[i];
    6.     var fields = record.fields.keys;

    7.     for (var j = 0; j < fields.length; j++) {
    8.       var name = fields[j];
    9.       var value = record.data[name];

    10.       var colIndex = cm.findColumnIndex(name);
    11.       var rowIndex = store.indexOfId(record.id);
    12.       var editor = cm.getCellEditor(colIndex).field;

    13.       if (!editor.validateValue(value)) {
    14.         Ext.Msg.alert('提示', '请检查输入的数据是否正确!', function(){
    15.           grid.startEditing(rowIndex, colIndex);
    16.         });
    17.         return;
    18.       }
    19.     }
    20.   }
    21.   var jsonArray = [];
    22.   Ext.each(m, function(item) {
    23.     jsonArray.push(item.data); //把修改过得数据放到jsonArray中
    24.   });

    25.   Ext.lib.Ajax.request(  //使用Ajax请求提交给后台
    26.     'POST',
    27.     'save_data.jsp',
    28.     {success: function(response){ //返回成功
    29.       Ext.Msg.alert('信息', response.responseText, function(){
    30.         store.reload();
    31.       });
    32.     },failure: function(){  //返回失败
    33.       Ext.Msg.alert("错误", "服务器保存数据出错!");
    34.     }},
    35.     'data=' + encodeURIComponent(Ext.encode(jsonArray))
    36.   );
    37. }
    复制代码
    另外store可以设置属性pruneModifiedRecords: true。这样,每次remove或load操作时store会自动清除modified标记,可以避免出现下次提交时还会把上次那些modified信息都带上的现象。

    限制表格输入的数据类型
    NumberField
    1. {
    2.   header:'ID',
    3.   dataIndex:'id',
    4.   editor:new Ext.grid.GridEditor(new Ext.form.NumberField({ //NumberField限制只能输入数字
    5.     allowBlank: false,
    6.     allowNegative: false, //不能输入减号
    7.     maxValue: 10
    8.   }))
    9. }
    复制代码
    ComboBox
    1. var comboData = [
    2.   ['0','Java'],
    3.   ['1','Android']
    4. ];
    5. {
    6.   header:'ComboBox',
    7.   dataIndex:'combo',
    8.   editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({
    9.     store: new Ext.data.SimpleStore({
    10.       fields:['value','text'],
    11.       data: comboData
    12.     }),
    13.     emptyText: '请选择',
    14.     mode: 'local',
    15.     triggerAction: 'all',
    16.     valueField: 'value',
    17.     displayField: 'text',
    18.     readOnly:true
    19.   })),
    20.   renderer: function(value){
    21.     return comboData[value][1];
    22.   }
    23. }
    复制代码
    DateField
    1. {
    2.   header:'Date',
    3.   dataIndex:'date',
    4.   editor:new Ext.grid.GridEditor(new Ext.form.DateField({
    5.     format: 'Y-m-d',
    6.     minValue: '2011-07-24',
    7.     disabledDays: [0, 6],
    8.     disabledDaysText: '选择周一到周六之间的日期'
    9.   })),
    10.   renderer: function(value) {
    11.     return value.format("Y-m-d");
    12.   }
    13. }
    复制代码
    属性表格控件PropertyGrid的使用
    是在EditorGrid的基础上开发的更智能的高级表格组件
    1. var grid = new Ext.grid.PropertyGrid({
    2.   title: '属性表格控件PropertyGrid',
    3.   autoHeight: true,
    4.   width: 400,
    5.   renderTo: 'grid',
    6.   viewConfig: {
    7.     forceFit: true
    8.   },
    9.   source: {
    10.     "String": "String",
    11.     "Date": new Date(Date.parse('07/24/2011')),
    12.     "boolean": false,
    13.     "float": .01
    14.   }
    15. });
    复制代码
    禁用PropertyGrid编辑功能的方法
    1. grid.on('beforeedit', function(e){
    2. e.cancel = true;
    3. return false;
    4. });
    复制代码
    根据表格的name获取value
    1. grid.store.getById('Jason').get(value);
    复制代码
    ExtJS中实现嵌套表格
    先看效果:


    代码如下:
    1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    2. <html>
    3. <head>
    4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    5. <title>test</title>
    6. <script type="text/javascript">
    7. </script>
    8. <link rel="stylesheet" type="text/css" href="Lib/ExtJs/2_2/resources/css/ext-all.css" />
    9. <script type="text/javascript" src="Lib/ExtJs/2_2/adapter/ext/ext-base.js"></script>
    10. <script type="text/javascript" src="Lib/ExtJs/2_2/ext-all-debug.js"></script>
    11. <script type="text/javascript" src="Lib/ExtJs/2_2/source/locale/ext-lang-zh_CN.js"></script>
    12. <script type="text/javascript" src="Lib/ExtJs/plus/RowExpander.js"></script>
    13. <script type="text/javascript">
    14. Ext.onReady(function(){
    15. var testData=[
    16.   ["lugreen","男",26,[["数学",100],["语文",150]]]
    17.   ,["lisi","男",25,[["数学",100],["语文",150]]]
    18.   ,["zhangsan","男",27,[["数学",120],["语文",158]]]  
    19. ];
    20. //
    21. storeTest= new Ext.data.SimpleStore({
    22.   fields: ["name","sex","age","grade"]
    23.   ,data: testData
    24. });
    25. var expander = new Ext.grid.RowExpander({
    26.     tpl : new Ext.XTemplate(
    27.     '<div class="detailData">',
    28.     '',
    29.     '</div>'
    30.     )
    31.     });
    32. expander.on("expand",function(expander,r,body,rowIndex){
    33. //查找 grid
    34. window.testEle=body;
    35. //alert(body.id);
    36. if (Ext.DomQuery.select("div.x-panel-bwrap",body).length==0){
    37.    //alert("a");
    38.    var data=r.json[3];
    39.    var store=new Ext.data.SimpleStore({
    40.       fields: ["class","degrade"]
    41.       ,data:data
    42.      });
    43.    var cm = new Ext.grid.ColumnModel([
    44.    {header: "科目",dataIndex: 'class',width: 130,hideable:false,sortable:false,resizable:true}
    45.    ,{header: "成绩",dataIndex: 'degrade',width: 130,hideable:false,sortable:false,resizable:true}
    46.    ]);
    47.    Ext.DomQuery.select("div.detailData")[0];
    48. var grid = new Ext.grid.GridPanel(
    49. {
    50.   store:store,
    51.   cm:cm,
    52.   renderTo:Ext.DomQuery.select("div.detailData",body)[0],
    53.   autoWidth:true,
    54.   autoHeight:true
    55.   }
    56. );

    57. }
    58. });
    59. //var sm=new Ext.grid.CheckboxSelectionModel({singleSelect:true});
    60.   var cm = new Ext.grid.ColumnModel([
    61.   expander
    62.   ,{header: "姓名",dataIndex: 'name',width: 50,hideable:false,sortable:false}
    63.   ,{header: "性别",dataIndex: 'sex',width: 130,hideable:false,sortable:false,resizable:true}
    64.   ,{header: "年龄",dataIndex: 'age',width: 130,hideable:false,sortable:false,resizable:true}
    65.   ]);
    66. var grid = new Ext.grid.GridPanel(
    67. {
    68.   id:'testgrid',
    69.   store:storeTest,
    70.   cm:cm,
    71.   renderTo:"grid1",
    72.   width:780,
    73.   autoHeight:false,
    74.   height:300,
    75.   listeners:{},
    76.    plugins:[expander]
    77.   }
    78.   );
    79. });
    80. </script>
    81. <style type="text/css">
    82. #div2 h2 {
    83.   font-weight:200;
    84.   font-size:12px;
    85. }
    86. .c1 h2 {
    87.   font-weight:200;
    88. }
    89. </style>
    90. </head>
    91. <body>
    92. <div id="grid1">

    93. </div>
    94. <div id="grid2">

    95. </div>
    96. </body>
    97. </html>
    复制代码
    其中使用到的"RowExpander.js"为extjs官方示例中自带的。
    实现这个嵌套表格要注意两点技巧:
    1.提供给外层表格的dataStore的数据源以嵌套数组的形式表示细节区的数据,如下面的黑体所示。
    1. var testData=[
    2.   ["lugreen","男",26,[["数学",100],["语文",150]]]
    3.   ,["lisi","男",25,[["数学",100],["语文",150]]]
    4.   ,["zhangsan","男",27,[["数学",120],["语文",158]]]  
    5. ];
    复制代码
    使用数组集中record对象的json属性来获取以细节区数据
    1. var data=r.json[3];
    复制代码
    2.在rowExpander的 expand事件中添加嵌套表格.

    来源:互联网
    免责声明:如果侵犯了您的权益,请联系站长(1277306191@qq.com),我们会及时删除侵权内容,谢谢合作!

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    ×

    最新评论

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表