小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

ExtJs4之gridPanel

 旭龍 2013-01-31

大家好,繼上次的treepanel之后,今天給大家介紹gridpanel,gridpanel也是在extjs編程中出現(xiàn)頻率高的一種組件,是必須要掌握的,當(dāng)然,gridpanel比treepanel要復(fù)雜的多,基本上能實現(xiàn)excel中大部分基本功能,功能相當(dāng)強(qiáng)大。

 

先上張截圖吧,一睹grid的芳容(這是未經(jīng)過處理的最基本的grid界面)

 

 

 

grid的實現(xiàn)包括model、store和view三個層面。

 

從model開始,先貼代碼再講解:

 

 

Js代碼  收藏代碼
  1. Ext.define('eduSys.Course.model', {  
  2.     extend : 'Ext.data.Model',  
  3.  // idProperty : 'name',  
  4.     fields : [  
  5.         {name : 'coursesGuid', type : 'string'},  
  6.         {name : 'code', type : 'string'},  
  7.         {name : 'name', type : 'string'},  
  8.         {name : 'period', type : 'int'}           
  9.     ]  
  10.  });  

 

代碼的一開始,先定義一個model類,名字自己取,然后就是model里的鍵值對屬性賦值,首先最重要的就是這個自定義的類要繼承自Ext.data.Model,用extend屬性來表示,再就是這個表格的基本屬性,即表格每一列代表的含義,用field屬性來表示,field是一個數(shù)組類型,里面存放各個列屬性對象,每個對象里面要定義對象的名字(name)和類型(type),便于與后面的store層進(jìn)行連接。至于idProperty(可有可無)這個屬性后面講解。這樣model就基本寫好了,很簡單吧。

 

下面store層,代碼如下:

 

Js代碼  收藏代碼
  1.  Ext.define('eduSys.KnowledgeCourse.store', {  
  2.   
  3.     extend : 'Ext.data.Store',  
  4.     model : 'eduSys.Course.model',  
  5.     storeId : 'knowledgeCourseStore',  
  6.     pageSize : 5,  
  7.       
  8.     proxy : {  
  9.         type : 'ajax',  
  10.         url : '../../KnowledgeUnitServlet',  
  11.         extraParams: {  
  12.             guid : document.location.search.split('=')[1],  
  13.             cmd : 'getCourses'  
  14.         },  
  15.         reader : {  
  16.             type : 'json'  
  17.         }  
  18.     },  
  19. /*  sorters : [{ 
  20.             property : 'name', 
  21.             direction : 'ASC' 
  22.     }],*/  
  23.     autoLoad : {start : 0, limit : 5}   
  24. });  

 

 store層也是自定義一個類,繼承自Ext.data.Store,然后這里也是定義model,就是前面寫的model層,model的賦值即前面寫的model層的名稱,然后最主要的是proxy,定義從后臺去取數(shù)據(jù),然后加載到grid 中,proxy中url好說,extraParams添加額外的參數(shù)傳到后臺,已json的形式讀取數(shù)據(jù)。store中的autoload屬性也需要賦值,代表程序什么時候像后臺發(fā)送請求加載數(shù)據(jù),可以賦boolean/Object,默認(rèn)的是false,默認(rèn)不發(fā)送請求,但可以在程序中可以通過grid的)函數(shù)拿到store對象然后調(diào)用load函數(shù),然后系統(tǒng)就會像后臺發(fā)送定義的proxy里的內(nèi)容并加載,若手動設(shè)置為true,表示一開始就請求數(shù)據(jù)。上面代碼賦值的是一個對象,用于分頁用的。

當(dāng)然,store也可以裝載已經(jīng)定義好的數(shù)據(jù)集,設(shè)置store的data屬性,里面存放對象數(shù)組,鍵值對與model相對應(yīng),則表格自動填充這些數(shù)據(jù),如下:

 

Java代碼  收藏代碼
  1. data : [  
  2.         {code : 'OS1', name : '萬俟輝夜1', period : 32},  
  3.         {code : 'OS2', name : '萬俟輝夜2', period : 48},  
  4.         {code : 'OS3', name : '萬俟輝夜3', period : 60},  
  5.     ],  
 

 

最后就是view層的代碼實現(xiàn)了:

 

Java代碼  收藏代碼
  1. Ext.define('eduSys.KnowledgeCourse.grid', {  
  2.       
  3.     extend : 'Ext.grid.Panel',  //繼承自Ext.grid.Panel  
  4.     alias : 'widget.knowledgeCourseGrid',  //取別名knowledgeCourseGrid  
  5.     title : '課程',  //表格標(biāo)題  
  6.     frame : true,//窗口化,即讓界面變的飽滿  
  7.     selType : 'cellmodel',//設(shè)置單元格選中方式,默認(rèn)為rowmodel,行選擇  
  8.     enableKeyNav : true,//允許鍵盤操作,即上下左右移動選中點  
  9.     forceFit : true,//自動填充,即讓所有列填充滿gird寬度  
  10.     config : [  //預(yù)先配置  
  11.         GridDoActionUtil = Ext.create('Ext.Util.GridDoActionUtil'),  //操作util類,這里可不管  
  12.         myStore = new eduSys.KnowledgeCourse.store()  //定義grid的store,即前面定義的store  
  13.     ],  
  14.     columns : [ //關(guān)鍵部分,定義每一列的屬性  
  15.         {  
  16.             text : '編號',                 //定義該列的標(biāo)題名稱  
  17.             dataIndex : 'code',     //對應(yīng)model中的列屬性  
  18.             align : 'center',           //居中顯示  
  19.             editor : {xtype : 'textfield'}   //定義該列可以編輯,編輯框形式  
  20.         },   
  21.         {  
  22.             text : '名稱',  
  23.             dataIndex : 'name',  
  24.             align : 'center'  
  25.         },  
  26.         {  
  27.             text : '學(xué)時',  
  28.             dataIndex : 'period',  
  29.             align : 'center'  
  30.         },  
  31.         {                 //這一列大家看看就行了,是actioncolumn相關(guān)操作  
  32.             xtype : 'actioncolumn',  
  33.             align : 'center',  
  34.             html : '<div style="margin-top: 4px;">詳情</div>',  
  35.             items: [{  
  36.                 icon : '../../images/view.png',  
  37.                 handler:   
  38.                     this.GridDoActionUtil.doDetail  
  39.             }]  
  40.         }  
  41.     ],  
  42.     tbar : [     //定義工具欄,上面可以存放各種組件  
  43.         {  
  44.             xtype : 'combobox',      //放一個combobox,用法以后再介紹  
  45.             id : 'courseCombo',  
  46.             store : new eduSys.Course.comboStore(),  
  47.             queryMode : 'remot',  
  48.             valueField : 'coursesGuid',  
  49.             displayField : 'name',  
  50.             editable : false  
  51.         },  
  52.         {xtype : 'button', text : '增加', iconCls : 'edu_add',     
  53.             handler : function(btnObj) {  
  54.                 //dosomething();      
  55.             }  
  56.         }, // 放一個button按鈕,定義它的樣式(iconCls),點擊響應(yīng)方式(handler)  
  57.         {xtype : 'button', text : '刪除', iconCls : 'edu_remove',  
  58.             handler :   
  59.                 this.GridDoActionUtil.doRemove  
  60.         }  
  61.     ],  
  62.     bbar : {    //定義底部工具欄  
  63.         xtype : 'pagingtoolbar',   //分頁工具條  
  64.         store : this.myStore,     //數(shù)據(jù)集跟grid的數(shù)據(jù)集一樣  
  65.         displayInfo : true          //是否顯示數(shù)據(jù)集信息  
  66.     },  
  67.       
  68.     selType : 'checkboxmodel',  //設(shè)置前面有多選框選項  
  69.     multiSelect : true,    //可以多選  
  70.     store : this.myStore        //定義grid的store,即前面寫的store  
  71. });  
 

 

view層的信息量就比較大了,所以基本信息都在代碼里添加注釋,應(yīng)該看的還比較清楚,有的屬性有不同的配置,大家可以在官網(wǎng)api上查找該屬性,上面有詳細(xì)的解釋,鑒于上面代碼已經(jīng)可以代表大部分的需求,這里就不在多說。

 

好了,上面代碼基本上能實現(xiàn)大部分對于表格的要求了,另外gird還有其他增強(qiáng)功能,比如拖拽、分組等等,每一列還有很多其他的屬性進(jìn)行設(shè)置,比如常見的render(渲染)、format(格式化)等等,今天由于時間原因就不寫了,以后要是有時間再寫一篇gird的增強(qiáng)篇,在這里像大家致歉。

 

 

貼一下grid的增加、刪除、保存行的操作代碼,比較簡單。

 

Java代碼  收藏代碼
  1. doAdd : function(grid, modelObj) {  
  2.         if(!(grid && modelObj)) {  
  3.             Ext.Msg.alert('error','參數(shù)傳遞不正確!!!');  
  4.             return;  
  5.         }  
  6.         var store = grid.getStore();  
  7.         //得到目前表格的數(shù)據(jù)集合的長度  
  8.         var storeCount = store.getCount();  
  9.         //得到編輯插件  
  10.         var edit = grid.editingPlugin;  
  11.         //得到數(shù)據(jù)模型  
  12.         var model = store.model;  
  13.           
  14.         var eduObj = new model(modelObj);  
  15.         store.insert(storeCount,eduObj);  
  16.     },  
  17.       
  18.     doRemove : function(grid) {  
  19.         var data = grid.getSelectionModel().getSelection();  
  20.         if(data.length == 0) {  
  21.             MsgTip.msg("提示","請選中項刪除!!!",true);  
  22.         } else {  
  23.             var st = grid.getStore();  
  24.             Ext.Array.each(data, function(record) {  
  25.                 st.remove(record);  
  26.             });  
  27.         }  
  28.     },  
  29.       
  30.     doSave : function(grid) {  
  31.         if(!grid) {  
  32.             Ext.Msg.alert('參數(shù)傳遞不正確!!!');  
  33.             return;   
  34.         }  
  35.         //得到數(shù)據(jù)集合  
  36.         var store = grid.getStore();  
  37.         //records 被你修改過的數(shù)據(jù)  
  38.         var records = store.getUpdatedRecords();  
  39.         var data = [];  
  40.         Ext.Array.each(records, function(model) {  
  41.             data.push(model.data);  
  42.         });  
  43.         if(data.length > 0) {  
  44.             Ext.Ajax.request({     //ajax后臺傳輸數(shù)據(jù)  
  45.                 url : '要傳的url',  
  46.                 params : {data : "[" +data.join(',')+ "]"},  
  47.                 method : 'POST',  
  48.                 timeout : 4000,  
  49.                 success : function(response,opts) {  
  50.                     //dosomething();  
  51.                     //取消小箭頭  
  52.                     model.commit();   
  53.                 }  
  54.             });  
  55.         }  
  56.     },  

 

下面說一下大家普遍遇到的grid保存中store.getUpdatedRecords();拿到數(shù)據(jù)為空的問題,我也是在上面糾結(jié)了一段時間,覺得有必要在這把解決方案提出來。

 

grid的model層有一個屬性:idProperty ,默認(rèn)是id,這個屬性就是grid所有列的主屬性,相當(dāng)于數(shù)據(jù)庫中的主鍵定義,是不可缺少的,所以當(dāng)你的model中配置沒有id基本字段的時候,extjs內(nèi)部的函數(shù)如getUpdatedRecords();就拿不到行的句柄(就用大家都懂的句柄這個詞吧),所以取出來的值為空,解決方案就是配置idProperty為你定義的字段中一個,這樣就解決了。

可是,有的兄臺可能碰到跟我一樣的問題,我的表格是可以新添加行的,用store的Number index, Ext.data.Model[] records )函數(shù)添加新的一行,這個添加的model中每個屬性都是空,但是,idProperty也配置了,結(jié)果拿出來的東西還是為空,我就納悶了,怎么還是行不通,最后經(jīng)過慢慢對比調(diào)試,終于發(fā)現(xiàn)了根本問題,在新增的一行中idProperty設(shè)置的屬性必須要賦值,就像主鍵不能為空一樣,經(jīng)過賦值后的model對象插入到gird中后再調(diào)用getUpdatedRecords(); 就沒有問題了,能正常拿出更改的值。

 

 

最后說一下grid的分頁組建的實現(xiàn)細(xì)節(jié)。

在store層的定義中就定義了pageSize表示每一頁的行數(shù),autoLoad中定義一個對象(如上面store中的autoLoader),上面表示最開始的起始位置和請求個數(shù),這樣在往后臺請求的URL中就增加了兩個請求參數(shù)start和limit,按上面代碼就是添加了start=0&limit=5,這樣后臺就可以接受參數(shù)進(jìn)行處理,那么上一頁下一頁又是怎么處理的呢,在bbar中定義了分頁組建,當(dāng)點擊下一頁的按鈕時,extjs會自動像后臺發(fā)送一個URL請求,與proxy是同一個url請求,同樣的會添加兩個請求參數(shù)start和limit,只是這時的start值就是當(dāng)前的值加上(下一頁)或者減去(上一頁)pageSize大小,在后臺進(jìn)行處理就行了。

 

 

最后的最后,本文如果寫的有什么不足,希望大家與我交流,共同學(xué)習(xí),共同進(jìn)步。。。。。。。。。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多