隨著records的增加,Browser會花更多的時間在畫grid,Ext.PagingToolbar主要用來處理這樣的問題,透過傳遞參數的方式(start:第幾筆開始,limit:共要幾筆),告知Server要傳送哪些資料。
注意,Ext.PagingToolbar只是告知Server要顯示的資料為何,而Ext.PagingToolbar預設會顯示所有的資料。
因為要讀取Server的資料,所以Store.proxy改用Ext.data.HttpProxy。而讀取的格式我們打算用json,所以,store.reader要用Ext.data.JsonReader。
我們的json file(phone_num.json)如下:
{ "success": true, "results": 12, // how many entry will be sent. "rows": [ // *Note: this must be an Array { "city": "台北市", "num": "02"}, { "city": "新竹市", "num": "03"}, { "city": "苗栗縣", "num": "037"}, { "city": "台中市", "num": "04"}, { "city": "南投縣", "num": "049"}, { "city": "嘉義市", "num": "05"}, { "city": "台南市", "num": "06"}, { "city": "高雄市", "num": "07"}, { "city": "屏東縣", "num": "08"}, { "city": "台東縣", "num": "089"}, { "city": "馬祖", "num": "0836"}, { "city": "烏坵", "num": "082"} ] }
Ext.onReady(function() { var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), { header: 'City', dataIndex: 'city' }, { header: 'Num', dataIndex: 'num' } ]); var store = new Ext.data.Store({ proxy: new Ext.data.HttpProxy({url: 'phone_num.json'}), reader: new Ext.data.JsonReader({ totalProperty: 'results', root: 'rows', fields: [{name: 'city'}, {name: 'num'}] }) }); store.load(); var grid = new Ext.grid.GridPanel({ renderTo: Ext.getBody(), store: store, cm: cm, sm: new Ext.grid.RowSelectionModel(), viewConfig: { forceFit: true }, title: "區碼", loadMask: true, height: 200, width: 330, bbar: new Ext.PagingToolbar({ pageSize: 5, store: store, displayInfo: true }) }); });
由於,我們在Server-Side都只是把整個資料丟給client,所以,grid即便有Ext.PagingToolbar,但是還是會顯示所有由Server丟過來的資料。
Paging with Local Data
在local paging官方網站上有提到兩種方式:
- Ext.ux.data.PagingStore
- Paging Memory Proxy(examples/ux/PagingMemoryProxy.js)
根據Ext.ux.data.PagingStore作者的說法,PagingMemoryProxy缺點如下:
- You have to write extra code to remote load the data for the proxy.
- query, filter and collect only work on the current page. You have to write extra code to use the PagingMemoryProxy filter support.
- Local sorting works, but you need to set remoteSort:true. There is no remote sorting support.
- Added and removed records are only remembered for the current page.
- Changing the page is relatively slow (PagingMemoryProxy reprocesses all data).
PagingStore.js for ext-js v3
PagingStore.js for ext-js v2
以下是v2的code:
Ext.onReady(function() { var cm = new Ext.grid.ColumnModel([ new Ext.grid.RowNumberer(), {header: 'City', dataIndex: 'city'}, {header: 'Num', dataIndex: 'num'} ]); var store = new Ext.ux.data.PagingStore({ proxy: new Ext.data.HttpProxy({url: 'phone_num.json'}), reader: new Ext.data.JsonReader({ root: 'rows', totalRecords: 'results', fields: [{name: 'city'}, {name: 'num'}] }) }); store.load({params:{start:0, limit: 4}}); var grid = new Ext.grid.GridPanel({ renderTo: Ext.getBody(), store: store, cm: cm, sm: new Ext.grid.RowSelectionModel(), viewConfig: { forceFit: true }, title: "區碼", loadMask: true, height: 200, width: 330, bbar: new Ext.PagingToolbar({ pageSize: 4, store: store, displayInfo: true }) }); });
可以看到,Server一樣丟全部的資料,但是Grid已經可以以paging的方式顯示了。
您好, 請問針對PagingMemoryProxy的第2項限制, 您有實作過怎麼解決嗎?
回覆刪除filter只能對目前頁的data有作用, 有些不方便, 或是您可以給我些方向該如何實作, 謝謝。