2008年12月29日

第 2 章 震撼吧!讓你知道ext表格控件的厲害 - PART II

grid會每次都顯示ds中所有的數據,咱們沒法利用靜態數據好好演示分頁,於是,必須寫後台腳本,讓ext與後台進行數據交互才能看到真實的分頁效果。



咱們盡量在原來的基礎上修改啊,把注意力集中在關鍵部位,一次性突破。



我不會其他語言,後台就用jsp寫啦。有個好消息是只要返回的數據格式一樣,ext才不管後台是什麼寫的呢。也就是這樣,不管你以後用什麼實現後台,前台的ext代碼都一樣。



<%

String start = request.getParameter("start");

String limit = request.getParameter("limit");

try {

int index = Integer.parseInt(start);

int pageSize = Integer.parseInt(limit);



String json = "{totalProperty:100,root:[";

for (int i = index; i < pageSize + index; i++) {

json += "{id:" + i + ",name:'name" + i + "',descn:'descn" + i + "'}";

if (i != pageSize + index - 1) {

json += ",";

}

}

json += "]}";

response.getWriter().write(json);

} catch(Exception ex) {

}

%>



下面我們來解讀這段jsp代碼︰



1.



在進行操作之前,我們先要獲得ext傳遞過來的兩個參數︰start和limit,start指的從第幾個數據開始顯示,limit是說從start開始,一共要用多少個數據,當然返回的數據可能會小於這個值。

2.



咱們在後台類比對100條數據進行分頁,在獲得了start和limit之後再生成json格式的數據。



何謂json?在理論講解之前先看看實例,讓我們能有個感性認識,至於以後能不能昇華到理性認識,就看各位的悟性了。



類比ext訪問後台,並傳遞兩個參數start=0&limit=10,把獲得的數據稍微整理一下,是這個樣子。



{totalProperty:100,root:[

{id:0,name:'name0',descn:'descn0'},

{id:1,name:'name1',descn:'descn1'},

{id:2,name:'name2',descn:'descn2'},

{id:3,name:'name3',descn:'descn3'},

{id:4,name:'name4',descn:'descn4'},

{id:5,name:'name5',descn:'descn5'},

{id:6,name:'name6',descn:'descn6'},

{id:7,name:'name7',descn:'descn7'},

{id:8,name:'name8',descn:'descn8'},

{id:9,name:'name9',descn:'descn9'}

]}



請記住這個數據格式,不管後台是什麼,只要滿足了這樣的格式要求,ext就可以接收處理,顯示到grid中。



我這裡就不好好介紹json,現下只需要知道json裡頭除了name(名稱)就是value(值),值有好幾種格式,如果是數字就不用加引號,如果加了引號就是字元串,如果用[]包裹就是數組,如果出現{}就說明是巢狀的json。諸如此類。



簡單瞄了json一眼,開頭就是totalProperty:100,這告訴ext︰“俺這裡有100個數據呢。”,然後就是root: [],root對應著一個數組,數組裡有10個對象,每個對象都有id呀,name呀,descn呀。這10個數據最後就應該顯示到表格裡。

3.



jsp裡用for循環生成root數組裡的數據,這樣我們翻頁的時候可以看到數據的變化,要不每次都是一樣的數據,你怎么知道翻頁是不是起作用了呢?



最後我們把得到的json字元串輸出到response裡,ext也就可以獲得這些數據了。



結果經過了一番折騰,我們的jsp已經確定可以返回我們所需要的數據了。現下我們可以忘掉後台是用什麼語言寫的了,直接切入ext代碼,看看它是怎么樣才能跑去後台獲得這些數據呢?



因為引入了json作為數據傳輸格式,這次我們要對ext代碼進行一次大換血了,請做好思想準備。



1.



換掉proxy,別在內存裡找了,讓我們透過http獲得我們想要的。



proxy: new Ext.data.HttpProxy({url:'grid.jsp'}),



創建HttpProxy的同時,用url這個參數指定咱們去那裡取數據,我們這裡設定成grid.jsp,就是我們剛才討論的jsp腳本啦。

2.



已經不是數組了,現下要用json咯。



reader: new Ext.data.JsonReader({

totalProperty: 'totalProperty',

root: 'root'

}, [

{name: 'id'},

{name: 'name'},

{name: 'descn'}

])



看比ArrayReader多了什麼?totalProperty對應咱們jsp返回的totalProperty,也就是數據的總數。root對應咱們jsp返回的root,就是一個包含返回數據的數組。

3.



好了,最後在初始化的時候,告訴我們希望獲得哪部分的數據就可以了。



ds.load({params:{start:0,limit:10}});



就在ds讀取的時候添加兩個參數,start和limit,告訴後台,我們從第一個數可以取起,最多要10個。



在這裡有一個小插曲,如果你按照我們以前的設定,grid是無法正常顯示的,因為ds.load()無法在grid.render()前準備好所有數組, 所以它不知道自己應該實現多高。沒法子,我們只好為它指定一個固定的高度了。像這樣<div id="grid" style="height:265px;"></div>。



最後,我們就可以使用分頁條上那些按鈕試試分頁了。呵呵~就這么簡單。



1.x的例子在lingo-sample/1.1.1/02-06.html,jsp檔案在lingo-sample/1.1.1/grid.jsp,下面是它的截圖︰



有趣的是,1.x中,不需要為div指定高度,它自己就知道如何顯示,不曉得為什麼2.0裡不這樣做呢。



2.0的例子在lingo-sample/2.0/02-06.html,jsp檔案在lingo-sample/2.0/grid.jsp,下面是它的截圖︰

2.7.4. 其實分頁不一定要踩在腳下,也可以頂在頭上。





我的意思是,grid除了FootPanel以外,還有HeaderPanel,意思就是頭頂上的面板。我們把分頁條放在上面也不會有任何問題。1.x中的代碼僅僅是將getFooterPanel改成getHeaderPanel,這樣分頁條就跑到上頭去了。



var gridHead = grid.getView().getHeaderPanel(true);



var paging = new Ext.PagingToolbar(gridHead, ds, {

pageSize: 10,

displayInfo: true,

displayMsg: '顯示第 {0} 條到 {1} 條記錄,一共 {2} 條',

emptyMsg: '沒有記錄'

});



1.x的例子可以在lingo-sample/1.1.1/02-07.html找到。



2.0就更簡單了,只需要改一個字母,b -> t,呵呵~,讓原來的bbar(bottom bar)變成tbar(top bar)就可以讓我們的工具條登天了。



var grid = new Ext.grid.GridPanel({

el: 'grid',

ds: ds,

cm: cm,

tbar: new Ext.PagingToolbar({

pageSize: 10,

store: ds,

displayInfo: true,

displayMsg: '顯示第 {0} 條到 {1} 條記錄,一共 {2} 條',

emptyMsg: "沒有記錄"

})

});



2.0的例子可以在lingo-sample/2.0/02-07.html找到。



呃,當然你可以讓上下都加上分頁條,反正它們最後都是共享一個ds,功能不會有任何問題哈。吼吼。

2.8. 可編輯表格,改變大小,表格間拖拽,樹與表格間拖拽。