EXTJS之GRID 一

最近空閒時間在學習Ext2.0框架,只有一個字的感嘆“強”,我從未想到JS代碼能夠寫出這麼絢麗的Web頁面出來,以前看到YUI,驚若天人,如今看到EXT2.0的東西,更是感覺震撼。

 

Ext2.0是一個JS框架,它的Grid控件和其它可以顯示數據的控件,能夠支持多種數據類型,如二維數組、Json數據和XML數據,甚至包括我們自定義的數據類型。Ext爲我們提供了一個橋樑Ext.data.Store,通過它我們可以把任何格式的數據轉化成grid可以使用的形式,這樣就不需要爲每種數據格式寫一個grid的實現了。

  首先,一個表格應該有列定義,即定義表頭ColumnModel:

Js代碼 複製代碼
  1. // 定義一個ColumnModel,表頭中有四列   
  2. var cm = new Ext.grid.ColumnModel([   
  3.     {header:'編號',dataIndex:'id'},   
  4.     {header:'性別',dataIndex:'sex'},   
  5.     {header:'名稱',dataIndex:'name'},   
  6.     {header:'描述',dataIndex:'descn'}   
  7. ]);   
  8. cm.defaultSortable = true;  

 

該ColumnModel定義了表格的四個列,其每列的名稱和對應的數據鍵。請注意defaultSortable屬性,即爲每個列都安上一個可以排序的功能。如果只想某些列舉有該功能,可以設置:

Js代碼 複製代碼
  1. {header:'編號',dataIndex:'id',Sortable:true},  

 現在就來看看這個Ext.data.Store是如何轉換三種數據的。

1.二維數組:

Js代碼 複製代碼
  1. // ArrayData   
  2. var data = [   
  3.     ['1','male','name1','descn1'],   
  4.     ['2','male','name1','descn2'],   
  5.     ['3','male','name3','descn3'],   
  6.     ['4','male','name4','descn4'],   
  7.     ['5','male','name5','descn5']   
  8. ];   
  9. // ArrayReader   
  10. var ds = new Ext.data.Store({   
  11.     proxy: new Ext.data.MemoryProxy(data),   
  12.     reader: new Ext.data.ArrayReader({}, [   
  13.         {name: 'id',mapping: 0},   
  14.         {name: 'sex',mapping: 1},   
  15.         {name: 'name',mapping: 2},   
  16.         {name: 'descn',mapping: 3}   
  17.     ])   
  18. });   
  19. ds.load();  

 

ds要對應兩個部分:proxy和reader。proxy告訴我們從哪裏獲得數據,reader告訴我們如何解析這個數據。

現在用的是Ext.data.MemoryProxy,它將內存中的數據data作爲參數傳遞。Ext.data.ArrayReader專門用來解析數組,並且告訴我們它會按照定義的規範進行解析,每行按順序讀取四個數據,第一個叫id,第二個叫sex,第三個叫name,第四個descn。這些是跟cm定義中的dataIndex對應的。這樣cm就知道哪列應該顯示那條數據了。

  mapping屬性用於標記data中的讀取後的數據與標頭的映射關係,一般是不用設置的。但如果我們想讓sex的數據中name欄中出現,可以設置mapping值。即id的mapping爲2,後者爲0。

  記得要執行一次ds.load(),對數據進行初始化。

  數據的顯示顯得非常簡單:

Html代碼 複製代碼
  1. <div id='grid'></div>  
<div id='grid'></div>

 

Js代碼 複製代碼
  1. var grid = new Ext.grid.GridPanel({   
  2.     el: 'grid',   
  3.     ds: ds,   
  4.     cm: cm   
  5. });   
  6. grid.render();  

 2.如何在表格中添加CheckBox呢?

Js代碼 複製代碼
  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:'sex'},   
  7.     {header:'名稱',dataIndex:'name'},   
  8.     {header:'描述',dataIndex:'descn'}   
  9. ]);   
  10. var grid = new Ext.grid.GridPanel({   
  11.     el: 'grid3',   
  12.     ds: ds,   
  13.     cm: cm,   
  14.     sm: sm,//添加的地方   
  15.     title: 'HelloWorld'  
  16. });  

 

3. 如何做Grid上觸發事件呢?

下面是一個cellclick事件

Js代碼 複製代碼
  1. grid.addListener('cellclick', cellclick);   
  2. function cellclick(grid, rowIndex, columnIndex, e) {   
  3.     var record = grid.getStore().getAt(rowIndex);   //Get the Record   
  4.     var fieldName = grid.getColumnModel().getDataIndex(columnIndex);  //Get field name   
  5.     var data = record.get(fieldName);   
  6.     Ext.MessageBox.alert('show','當前選中的數據是'+data);   
  7. }  

 

4.如何做Grid中做出快捷菜單效果:

Js代碼 複製代碼
  1. grid.addListener('rowcontextmenu', rightClickFn);//右鍵菜單代碼關鍵部分   
  2. var rightClick = new Ext.menu.Menu({   
  3.     id:'rightClickCont',  //在HTML文件中必須有個rightClickCont的DIV元素   
  4.     items: [   
  5.         {   
  6.             id: 'rMenu1',   
  7.            handler: rMenu1Fn,//點擊後觸發的事件   
  8.             text: '右鍵菜單1'  
  9.         },   
  10.         {   
  11.             //id: 'rMenu2',   
  12.             //handler: rMenu2Fn,   
  13.             text: '右鍵菜單2'  
  14.         }   
  15.     ]   
  16. });   
  17. function rightClickFn(grid,rowindex,e){   
  18.     e.preventDefault();   
  19.     rightClick.showAt(e.getXY());   
  20. }   
  21. function rMenu1Fn(){   
  22.    Ext.MessageBox.alert('right','rightClick');   
  23. }  

 

5.如何將一列中的數據根據要求進行改變呢?

比如說性別字段根據其male或female改變顯示的顏色,這種ColumnMode中設計:

Js代碼 複製代碼
  1. var cm = new Ext.grid.ColumnModel([   
  2.     new Ext.grid.RowNumberer(),   
  3.     sm,   
  4.     {header:'編號',dataIndex:'id'},   
  5.     {header:'性別',dataIndex:'sex',renderer:changeSex},   
  6.     {header:'名稱',dataIndex:'name'},   
  7.     {header:'描述',dataIndex:'descn'}   
  8. ]);   
  9. cm.defaultSortable = true;   
  10. function changeSex(value){   
  11.     if (value == 'male') {   
  12.         return "<span style='color:red;font-weight:bold;'>紅男</span>";   
  13.     } else {   
  14.         return "<span style='color:green;font-weight:bold;'>綠女</span>";   
  15.     }   
  16. }  

 其它兩種數據的Grid顯示是相同的,其不同之處在於數據獲取的過程:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章