JavaScript的ExtJS框架中表格的編寫教程
ExtJS中表格的特性簡介
表格由類Ext.grid.GridPanel定義,繼承自Ext.Panel,xtype為grid
表格的列信息由Ext.grid.ColumnModel定義
表格的數(shù)據(jù)存儲器由Ext.data.Store定義,根據(jù)解析數(shù)據(jù)的不同,數(shù)據(jù)存儲器可具體分為如下幾種:
JsonStore,SimpleStore,GroupingStore…
一個(gè)表格的基本編寫過程:
1、創(chuàng)建表格列模型
var cm = new Ext.grid.ColumnModel({ {header: '角色', dataIndex: 'role'}, {header: '等級', dataIndex: 'grade'}, {header: '創(chuàng)建日期', dataIndex: 'createDate', type: 'date', renderer: Ext.util.Format.dateRenderer('Y年m月d日')} //創(chuàng)建日期類型的數(shù)據(jù) });
2、創(chuàng)建數(shù)據(jù)數(shù)組
var data = [ ['士兵','7','2011-07-2412:34:56'], ['將軍','10','2011-07-2412:34:56'], ];
3、創(chuàng)建一個(gè)數(shù)據(jù)存儲對象store,包含兩部分:proxy,獲取數(shù)據(jù)的方式;reader,解析數(shù)據(jù)的方式
ArrayReader的mapping用來設(shè)置列的排列順序
var store = new Ext.data.Store({ proxy: new Ext.data.MemoryProxy(data), reader: new Ext.data.ArrayReader({}, [ {name: 'role', mapping: 1}, {name: 'grade', mapping: 0} {name: 'createDate', mapping: 2, type:'date', dateFormat:'Y-m-dH:i:s'} //創(chuàng)建日期列和顯示格式 ]) }); store.load();
4、創(chuàng)建GridPanel,裝配ColumnModel和store
var grid = new Ext.grid.GridPanel({ renderTo: 'grid', store: store, cm: cm });
另外獲取遠(yuǎn)程數(shù)據(jù)可以使用ScriptTagProxy,如下所示
var store = new Ext.data.Store({ proxy: new Ext.data.ScriptTagProxy({ url:'http://...'}), reader: new Ext.data.ArrayReader({}, [ {name: 'role', mapping: 1}, {name: 'grade', mapping: 0} ]), sortInfo: {field: "role", direction: "ASC"} //設(shè)置默認(rèn)排序列,ASC/DESC });
表格的常用屬性功能
var grid = new Ext.grid.GridPanel({ enableColumnMove: false, //禁止拖放列 enableColumnResize: false, //禁止改變列的寬度 stripeRows: true, //斑馬線效果 loadMask: true, //讀取數(shù)據(jù)時(shí)的遮罩和提示功能 renderTo: 'grid', store: store cm: cm }); var cm = new Ext.grid.ColumnModel({ {header: '角色', dataIndex: 'role', width:90, sortable: true}, //width設(shè)置列寬度,默認(rèn)為100px,sortable設(shè)置排序功能 {id:'grade', header: '等級', dataIndex: 'grade', width:40} }); var grid = new Ext.grid.GridPanel({ renderTo: 'grid', store: store, cm: cm viewConfig:{ //讓每列自動填充滿表格 forceFit: true } autoExpandColumn: 'grade' //自動延伸列,列的id在ColumnModel中定義 });
渲染表格,為表格設(shè)置特殊樣式
只需要在cm里面增加一個(gè)renderer屬性,添加一個(gè)自定義函數(shù)來渲染傳進(jìn)來(由EXT自動傳遞)的參數(shù)的樣式即可,即在返回value之前拼裝上相應(yīng)的HTML和CSS或者JS響應(yīng)事件。
function renderSex(value) { if (value == 'male') { return "<span style='color:blue;'>男</span><img src='images/icon_male.png' />"; } else { return "<span style='color:red;'>女</span><img src='images/icon_female.png' />"; } } var cm = new Ext.grid.ColumnModel([ {header:'id',dataIndex:'id'}, {header:'name',dataIndex:'name'}, {header:'sex',dataIndex:'sex',renderer:renderSex}, ]); var data = [ ['1','Jason','male'], ['2','Kate','female'] ]; var store = new Ext.data.Store({ proxy: new Ext.data.MemoryProxy(data), reader: new Ext.data.ArrayReader({}, [ {name: 'id'}, {name: 'name'}, {name: 'sex'} ]) }); store.load(); var grid = new Ext.grid.GridPanel({ autoHeight: true, renderTo: 'grid', store: store, cm: cm });
自動顯示行號,只要在創(chuàng)建cm時(shí)創(chuàng)建一個(gè)RowNumberer就可以了
var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), //顯示行號 {header:'id',dataIndex:'id'}, {header:'name',dataIndex:'name'}, {header:'sex',dataIndex:'sex',renderer:renderSex}, ]);
刪除列
store.remove(store.getAt(i));
刷新表格
grid.view.refresh();
為表格添加復(fù)選框
需要使用CheckboxSelectionModel
SelectionModel sm在使用時(shí)要放到cm和表格中
var sm = new Ext.grid.CheckboxSelectionModel(); var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), sm, {header:'編號',dataIndex:'id'}, {header:'名稱',dataIndex:'name'} ]); var data = [ ['1','name1'], ['2','name2'] ]; var store = new Ext.data.Store({ proxy: new Ext.data.MemoryProxy(data), reader: new Ext.data.ArrayReader({}, [ {name: 'id'}, {name: 'name'} ]) }); store.load(); var grid = new Ext.grid.GridPanel({ autoHeight: true, renderTo: 'grid', store: store, cm: cm, sm: sm });
通過RowSelectionModel設(shè)置只選擇一行:
var grid = new Ext.grid.GridPanel({ autoHeight: true, renderTo: 'grid', store: store, cm: cm, sm: new Ext.grid.RowSelectionModel({singleSelect:true}) });
使用選擇模型獲取數(shù)據(jù)
grid.on('click', function() { var selections = grid.getSelectionModel().getSelections(); for (var i = 0; i < selections.length; i++) { var record = selections[i]; Ext.Msg.alert(record.get("id")); } });
表格視圖
從MVC的思想來看表格控件:
* Ext.data.Store可看做模型
* Ext.grid.GridPanel可看做控制器
* Ext.grid.GridView可看做視圖
* 一般GridView由GridPanell自動生成,如果想設(shè)置GridView的屬性時(shí),可以通過Ext.grid.GridPanel的getView()獲得視圖實(shí)例
Ext.get('button1').on('click', function() { grid.getView().scrollToTop(); grid.getView().focusCell(0, 0); var cell = grid.getView().getCell(0, 0); cell.style.backgroundColor = 'red'; });
使用GridPanel的viewConfig在創(chuàng)建表格時(shí)設(shè)置GridView的初始化參數(shù)
var grid = new Ext.grid.GridPanel({ height: 100, width: 400, renderTo: 'grid', store: new Ext.data.Store({ autoLoad: true, proxy: new Ext.data.MemoryProxy(data), reader: new Ext.data.ArrayReader({}, meta) }), columns: meta, viewConfig: { columnsText: '顯示的列', //設(shè)置下拉菜單提示文字 scrollOffset: 30, //設(shè)置右側(cè)滾動條的預(yù)留寬度 sortAscText: '升序', //設(shè)置下拉菜單提示文字 sortDescText: '降序', //設(shè)置下拉菜單提示文字 forceFit: true //自動延展每列的長度 } });
為表格添加分頁工具條
* 可以使用GridPanel的bbar屬性,并創(chuàng)建Ext.PagingToolbar分頁工具條對象
* 注意,如果配置了分頁工具條,store.load()就必須在構(gòu)造表格以后執(zhí)行。
var grid = new Ext.grid.GridPanel({ renderTo: 'grid', autoHeight: true, store: store, cm: cm, bbar: new Ext.PagingToolbar({ pageSize: 10, //每頁顯示10條數(shù)據(jù) store: store, displayInfo: true, //顯示數(shù)據(jù)信息 displayMsg: '顯示第 {0} 條到 {1} 條記錄,一共 {2} 條', emptyMsg: "沒有記錄" //沒有數(shù)據(jù)時(shí)顯示的信息 }) }); store.load();
從后臺腳本獲取分頁數(shù)據(jù)
使用HttpProxy傳遞請求,獲取服務(wù)器的JSON數(shù)據(jù),交給JsonReader解析
var cm = new Ext.grid.ColumnModel([ {header:'編號',dataIndex:'id'}, {header:'名稱',dataIndex:'name'} ]); var store = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({url:'page.jsp'}), reader: new Ext.data.JsonReader({ totalProperty: 'totalProperty', root: 'root' }, [ {name: 'id'}, {name: 'name'} ]) }); var grid = new Ext.grid.GridPanel({ renderTo: 'grid', autoHeight: true, //數(shù)據(jù)傳回來之前高度未知,所以要使用自適應(yīng)高度 store: store, cm: cm, bbar: new Ext.PagingToolbar({ pageSize: 10, store: store, displayInfo: true, displayMsg: '顯示第 {0} 條到 {1} 條記錄 / 共 {2} 條', emptyMsg: "沒有記錄" }) }); store.load({params:{start:0,limit:10}});
如果想讓分頁工具條顯示在表格的頂部,可以使用GridPanel的tbar屬性設(shè)置添加工具條
讓ExtJS在對返回的數(shù)據(jù)進(jìn)行分頁
* 需要在頁面中引入examples/locale目錄下的PagingMemoryProxy.js文件
* 再使用PagingMemoryProxy設(shè)置代理
var store = new Ext.data.Store({ proxy: new Ext.data.PagingMemoryProxy(data), reader: new Ext.data.ArrayReader({}, [ {name: 'id'}, {name: 'name'}, {name: 'descn'} ]) }); //在創(chuàng)建GridPanel之后調(diào)用 store.load({params:{start:0,limit:3}});
可編輯表格控件EditorGrid的使用
制作一個(gè)簡單的EditorGrid的步驟:
1、定義列ColumnModel,在里面添加editor屬性
var cm = new Ext.grid.ColumnModel([{ header: '編號', dataIndex: 'id', editor: new Ext.grid.GridEditor( new Ext.form.TextField({ allowBlank: false //不允許在TextField中輸入空值 }) ) }, { header: '名稱', dataIndex: 'name', editor: new Ext.grid.GridEditor( new Ext.form.TextField({ allowBlank: false }) ) }]);
2、準(zhǔn)備一個(gè)數(shù)組
var data = [ ['1','Jason'], ['2','Jay'] ];
3、創(chuàng)建Ext.data.Store,設(shè)置內(nèi)存代理,設(shè)置ArrayReader解析數(shù)組
var store = new Ext.data.Store({ proxy: new Ext.data.MemoryProxy(data), reader: new Ext.data.ArrayReader({}, [ {name: 'id'}, {name: 'name'} ]) });
4、加載數(shù)據(jù),創(chuàng)建EditorGridPanel
store.load(); var grid = new Ext.grid.EditorGridPanel({ autoHeight: true, renderTo: 'grid', store: store, cm: cm });
為可編輯表格添加和刪除數(shù)據(jù)
1、使用Record的create方法創(chuàng)建一個(gè)記錄集MyRecord,MyRecord相當(dāng)于一個(gè)類
var MyRecord = Ext.data.Record.create([ {name: 'id', type: 'string'}, {name: 'name', type: 'string'} ]); store.load();
2、創(chuàng)建EditorGridPanel面板,在屬性tbar中創(chuàng)建Ext.Toolbar
var grid = new Ext.grid.EditorGridPanel({ autoHeight: true, renderTo: 'grid', store: store, cm: cm, tbar: new Ext.Toolbar(['-', { //-表示菜單分隔符 text: '添加一行', handler: function(){ var p = new MyRecord({ id:'', name:'' }); grid.stopEditing(); //關(guān)閉表格的編輯狀態(tài) store.insert(0, p); //創(chuàng)建的Record插入store的第一行 grid.startEditing(0, 0); //激活第一行第一列的編輯狀態(tài) } }, '-', { text: '刪除一行', handler: function(){ Ext.Msg.confirm('信息', '確定要?jiǎng)h除?', function(btn){ if (btn == 'yes') { var sm = grid.getSelectionModel(); //獲取表格的選擇模型 var cell = sm.getSelectedCell(); //獲取選中的單元格 var record = store.getAt(cell[0]); //通過行號得到store這一行對應(yīng)的Record store.remove(record); //移除數(shù)據(jù) } }); } }, '-']) });
為可編輯表格保存修改的結(jié)果
在上面例子的基礎(chǔ)之上,添加一個(gè)保存按鈕
text: '保存', handler: function(){ var m = store.modified.slice(0); //獲得store中修改過得數(shù)據(jù) for (var i = 0; i < m.length; i++) { //驗(yàn)證表格信息是否正確,是否包含空格 var record = m[i]; var fields = record.fields.keys; for (var j = 0; j < fields.length; j++) { var name = fields[j]; var value = record.data[name]; var colIndex = cm.findColumnIndex(name); var rowIndex = store.indexOfId(record.id); var editor = cm.getCellEditor(colIndex).field; if (!editor.validateValue(value)) { Ext.Msg.alert('提示', '請檢查輸入的數(shù)據(jù)是否正確!', function(){ grid.startEditing(rowIndex, colIndex); }); return; } } } var jsonArray = []; Ext.each(m, function(item) { jsonArray.push(item.data); //把修改過得數(shù)據(jù)放到j(luò)sonArray中 }); Ext.lib.Ajax.request( //使用Ajax請求提交給后臺 'POST', 'save_data.jsp', {success: function(response){ //返回成功 Ext.Msg.alert('信息', response.responseText, function(){ store.reload(); }); },failure: function(){ //返回失敗 Ext.Msg.alert("錯(cuò)誤", "服務(wù)器保存數(shù)據(jù)出錯(cuò)!"); }}, 'data=' + encodeURIComponent(Ext.encode(jsonArray)) ); }
另外store可以設(shè)置屬性pruneModifiedRecords: true。這樣,每次remove或load操作時(shí)store會自動清除modified標(biāo)記,可以避免出現(xiàn)下次提交時(shí)還會把上次那些modified信息都帶上的現(xiàn)象。
限制表格輸入的數(shù)據(jù)類型
NumberField
{ header:'ID', dataIndex:'id', editor:new Ext.grid.GridEditor(new Ext.form.NumberField({ //NumberField限制只能輸入數(shù)字 allowBlank: false, allowNegative: false, //不能輸入減號 maxValue: 10 })) }
ComboBox
var comboData = [ ['0','Java'], ['1','Android'] ]; { header:'ComboBox', dataIndex:'combo', editor:new Ext.grid.GridEditor(new Ext.form.ComboBox({ store: new Ext.data.SimpleStore({ fields:['value','text'], data: comboData }), emptyText: '請選擇', mode: 'local', triggerAction: 'all', valueField: 'value', displayField: 'text', readOnly:true })), renderer: function(value){ return comboData[value][1]; } }
DateField
{ header:'Date', dataIndex:'date', editor:new Ext.grid.GridEditor(new Ext.form.DateField({ format: 'Y-m-d', minValue: '2011-07-24', disabledDays: [0, 6], disabledDaysText: '選擇周一到周六之間的日期' })), renderer: function(value) { return value.format("Y-m-d"); } }
屬性表格控件PropertyGrid的使用
是在EditorGrid的基礎(chǔ)上開發(fā)的更智能的高級表格組件
var grid = new Ext.grid.PropertyGrid({ title: '屬性表格控件PropertyGrid', autoHeight: true, width: 400, renderTo: 'grid', viewConfig: { forceFit: true }, source: { "String": "String", "Date": new Date(Date.parse('07/24/2011')), "boolean": false, "float": .01 } });
禁用PropertyGrid編輯功能的方法
grid.on('beforeedit', function(e){ e.cancel = true; return false; });
根據(jù)表格的name獲取value
grid.store.getById('Jason').get(value);
ExtJS中實(shí)現(xiàn)嵌套表格
先看效果:
代碼如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>test</title> <script type="text/javascript"> </script> <link rel="stylesheet" type="text/css" href="Lib/ExtJs/2_2/resources/css/ext-all.css" /> <script type="text/javascript" src="Lib/ExtJs/2_2/adapter/ext/ext-base.js"></script> <script type="text/javascript" src="Lib/ExtJs/2_2/ext-all-debug.js"></script> <script type="text/javascript" src="Lib/ExtJs/2_2/source/locale/ext-lang-zh_CN.js"></script> <script type="text/javascript" src="Lib/ExtJs/plus/RowExpander.js"></script> <script type="text/javascript"> Ext.onReady(function(){ var testData=[ ["lugreen","男",26,[["數(shù)學(xué)",100],["語文",150]]] ,["lisi","男",25,[["數(shù)學(xué)",100],["語文",150]]] ,["zhangsan","男",27,[["數(shù)學(xué)",120],["語文",158]]] ]; // storeTest= new Ext.data.SimpleStore({ fields: ["name","sex","age","grade"] ,data: testData }); var expander = new Ext.grid.RowExpander({ tpl : new Ext.XTemplate( '<div class="detailData">', '', '</div>' ) }); expander.on("expand",function(expander,r,body,rowIndex){ //查找 grid window.testEle=body; //alert(body.id); if (Ext.DomQuery.select("div.x-panel-bwrap",body).length==0){ //alert("a"); var data=r.json[3]; var store=new Ext.data.SimpleStore({ fields: ["class","degrade"] ,data:data }); var cm = new Ext.grid.ColumnModel([ {header: "科目",dataIndex: 'class',width: 130,hideable:false,sortable:false,resizable:true} ,{header: "成績",dataIndex: 'degrade',width: 130,hideable:false,sortable:false,resizable:true} ]); Ext.DomQuery.select("div.detailData")[0]; var grid = new Ext.grid.GridPanel( { store:store, cm:cm, renderTo:Ext.DomQuery.select("div.detailData",body)[0], autoWidth:true, autoHeight:true } ); } }); //var sm=new Ext.grid.CheckboxSelectionModel({singleSelect:true}); var cm = new Ext.grid.ColumnModel([ expander ,{header: "姓名",dataIndex: 'name',width: 50,hideable:false,sortable:false} ,{header: "性別",dataIndex: 'sex',width: 130,hideable:false,sortable:false,resizable:true} ,{header: "年齡",dataIndex: 'age',width: 130,hideable:false,sortable:false,resizable:true} ]); var grid = new Ext.grid.GridPanel( { id:'testgrid', store:storeTest, cm:cm, renderTo:"grid1", width:780, autoHeight:false, height:300, listeners:{}, plugins:[expander] } ); }); </script> <style type="text/css"> #div2 h2 { font-weight:200; font-size:12px; } .c1 h2 { font-weight:200; } </style> </head> <body> <div id="grid1"> </div> <div id="grid2"> </div> </body> </html>
其中使用到的"RowExpander.js"為extjs官方示例中自帶的。
實(shí)現(xiàn)這個(gè)嵌套表格要注意兩點(diǎn)技巧:
1.提供給外層表格的dataStore的數(shù)據(jù)源以嵌套數(shù)組的形式表示細(xì)節(jié)區(qū)的數(shù)據(jù),如下面的黑體所示。
var testData=[ ["lugreen","男",26,[["數(shù)學(xué)",100],["語文",150]]] ,["lisi","男",25,[["數(shù)學(xué)",100],["語文",150]]] ,["zhangsan","男",27,[["數(shù)學(xué)",120],["語文",158]]] ];
使用數(shù)組集中record對象的json屬性來獲取以細(xì)節(jié)區(qū)數(shù)據(jù)
var data=r.json[3];
2.在rowExpander的 expand事件中添加嵌套表格.
相關(guān)文章
Extjs NumberField后面加單位實(shí)現(xiàn)思路
本文為大家介紹下在NumberField后面加單位,具體實(shí)現(xiàn)如下,感興趣的朋友可以參考下2013-07-07ExtJs 學(xué)習(xí)筆記 Ext.Panle Ext.TabPanel Ext.Viewport
ExtJs 學(xué)習(xí)筆記基礎(chǔ)篇 面板的使用(Ext.Panle、Ext.TabPanel、Ext.Viewport)2008-12-12ANT 壓縮(去掉空格/注釋)JS文件可提高js運(yùn)行速度
在解決這個(gè)有很多優(yōu)化方法,今天來說其中一種,那就是在Ant腳本打包的時(shí)候,把js中空格、注釋去掉、以及合并,合并今天不說了,還未實(shí)現(xiàn)這個(gè),在研究中2013-04-04ComboBox 和 DateField 在IE下消失的解決方法
開發(fā)過程中卻遇到了在 IE 瀏覽器中放大、縮小窗口大小會導(dǎo)致這兩個(gè)組件消失不見不報(bào)任何錯(cuò)誤且在其他瀏覽器正常,通過本文你將學(xué)會如何解決此問題2013-08-08Extjs中ComboBox加載并賦初值的實(shí)現(xiàn)方法
當(dāng)需要為ComboBox加載數(shù)據(jù)后進(jìn)行賦初始選中項(xiàng)的話,如果是寫在store.load()之后2012-03-03Ext JS 4實(shí)現(xiàn)帶week(星期)的日期選擇控件(實(shí)戰(zhàn)二)
Javascript 有提供Date 對象用于處理時(shí)間。但是Date 并沒有提供獲取星期的方法,jquery 的擴(kuò)展組件 等有直接提供這樣的一些現(xiàn)成包,感興趣的朋友可以了解下2013-08-08