Ext.data 在命名空間中定義了一系列 store, reader 和 proxy. Gird 與 ComboBox 都是以 Ext.data 為媒介獲取資料. 它包含非同步載入, 類型轉換, 分頁等功能. Ext.data 支援 Array, JSON 與 XML 等資料格式. 可以透過 Memory, HTTP 與 ScriptTag 等方式獲取這些格式的資料.
Ext.data.Connection:
Ext.data.Connection 是對 Ext.lib.Ajax 的封裝, 它提供了配置使用 Ajax 的通用方式, 它在內部透過 Ext.lib.Ajax 實現與後台的非同步呼叫. 與底層的 Ext.lib.Ajax 相比, Ext.data.Connection 提供了更簡潔的配置方式, 使用上更方便.
Ext.data.Connection 主要用於 Ext.data.HttpProxy 和 Ext.data.ScriptTagProxy 中執行與後台互動的任務, 它會從指定的 URL 獲得資料, 並把後台傳回的資料交給 HttpProxy 或 ScriptTagProxy 處理. 底下為使用範例代碼:
- var conn = new Ext.data.Connection({
- autoAbort: false,
- defaultHeaders:{
- referer: 'http://localhost:8080/'
- },
- disableCaching: false,
- extraParams:{
- name: 'name'
- },
- method: 'Get',
- timeout: 300,
- url: '01-01.txt'
- });
在建立的 conn 之後, 可以呼叫 request() 函數發送請求並處理返回結果, 範例程式如下:
- conn.request({
- success: function(response)
- {
- Ext.Msg.alert('info', response.responseText);
- },
- failure: function()
- {
- Ext.Msg.alert('warn', 'failure');
- }
- });
Ext.data.Connection 還提供 abort([Number of transactionId]) 函數, 當同時有多個請求發生時, 根據指定的事物 id 放棄其中一個請求. 如果不指定事務 id, 就會放棄最後一個請求.isLoading([Number of transactionId]) 函數用法語 abort() 類似, 可以根據事務 id 判斷對應請求是否完成. 如果未指定事務 id, 就判斷最後一個請求是否完成.
Ext.data.Record:
Ext.data.Record 是一個設定了內部資料類型的物件, 它是 Ext.data.Store 的最基本組成部分. 如果把 Ext.data.Store 看作是一張二維表, 那麼它的每一行就對應一個 Ext.data.Record 實例.Ext.data.Record 的主要功能是保存資料, 而且在內部資料發生變動時紀錄修改狀態, 並且可以保留修改前的原始值.
我們使用 Ext.data.Record 時通常都是由 create() 函數開始, 首先使用該函數建立一個自訂的 Record 類型, 代碼如下:
- var PersonRecord = Ext.data.Record.create([
- {name: 'name', type: 'string'},
- {name: 'sex', type: 'int'}
- ]);
- var boy = new PersonRecord({
- name: 'boy',
- sex: 0
- });
- Ext.Msg.alert('Info1', boy.data.name);
- Ext.Msg.alert('Info2', boy.data['name']);
- Ext.Msg.alert('Info3', boy.get('name'));
- boy.data.name = 'boy name';
- boy.data['name'] = 'boy name';
- boy.set('name', 'boy name');
* commit() : 提交
* reject() : 撤銷
* getChanges(): 獲得修改的部分
* isModified() :
Ext.data.Record 還提供一個用於複製 Record 實例的函數 copy():
- var copyBoy = boy.copy();
Ext.data.Store:
Ext.data.Store 是 EXT 中用來進行資料交換和資料互動的標準中介物件, 無論是 Grid 或是 ComboBox, 都是透過它實現資料讀取, 類型轉換, 排序分頁與搜尋等操作. Ext.data.Store 中有一個Ext.data.Record 陣列, 所有資料都存放在這裡, 為後面的讀取和修改做準備.
- 基本應用
在使用之前, 首先要建立一個 Ext.data.Store 的實例,代碼如下:
- var data = [
- ['boy', 0],
- ['girl', 1]
- ];
- var PersonRecord = Ext.data.Record.create([
- {name: 'name', type: 'string'},
- {name: 'sex', type: 'int'}
- ]);
- var store = new Ext.data.Store({
- proxy: new Ext.data.MemoryProxy(data),
- reader: new Ext.data.ArrayReader({}, PersonRecord)
- });
- store.load();
- 對資料進行排序
Ext.data.Store 提供一系列屬性和函數, 可以利用它們對資料進行操作如排序等. 在建立 Ext.data.Store 時可以使用 sortInfo 參數指定排序的欄位與排序方式. 範例代碼如下:
- var store = new Ext.data.Store({
- proxy: new Ext.data.MemoryProxy(data),
- reader: new Ext.data.ArrayReader({}, PersonRecord),
- sortInfo: {field: 'name', direction: 'DESC'}
- });
或者你也可以在任何時候呼叫 sort() 函數如 store.sort('name', 'DESC') 對 store 中的資料進行排序. 如果我們希望獲取 store 的排序資訊, 可以呼叫 getSortState() 函數. 返回類似 {field: 'name' ,direction: 'DESC'} 的 JSON 物件.
- 從 store 中獲取資料
從 store 中獲取資料的途徑有很多種, 可以依據不同要求選擇不同函數. 最直接的方法是根據 record 在 store 中的行號獲得對應的 record, 得到了 record 就可以使用 get() 函數獲得裡面的資料了. 範例代碼如下:
- store.getAt(0).get('name');
- for(var i = 0; i < store.getCount(); i++)
- {
- var record = store.getAt(i);
- alert(record.get('name'));
- }
- store.each(function(record){
- alert(record.get('name'));
- });
- var records = store.getRange(0, 1);
- for(var i=0; i
- {
- var record = records[i];
- alert(record.get('name'));
- }
- store.getById(1001).get('name');
在這五個參數中, 只有前兩個是必須的. 第一個參數 property 代表搜尋的欄位名稱; 第二個參數 value 是比對用字串或是正則表示式; 第三個參數 startIndex 表示從第幾行開始搜尋; 第四個參數 anyMatch 為 true 時, 不必從頭開始比對; 第五個參數 caseSensitive 為 true 會區分大小寫. 使用範例如下:
- var index = store.find('name', 'g');
- alert(store.getAt(index).get('name'));
findBy() 函數可以讓使用者使用自定義函數對內部資料進行搜尋. fn 返回 true 時, 表示搜尋成功, 於是停止走遍並返回行號; fn 返回 false 時, 表示搜尋失敗 (未找到) 並繼續搜尋. 使用範例如下:
- var index = store.findBy(function(record, id){
- return record.get('name') == 'girl' && record.get('sex') == 1;
- });
- alert(store.getAt(index).get('name'));
- alert(store.query('name', 'boy'));
- alert(store.queryBy(function(record){
- return record.get('name') == 'girl' && record.get('sex') == 1;
- }));
可以使用 add(Ext.data.Record[] records) 向 store 末尾加入一個或多個 record. 使用的參數可以是一個或多個 record 實例. 使用範例如下:
- // 添加一個
- store.add(new PersonRecord({
- name: 'other',
- sex: 0
- }));
- // 添加多個
- store.add(new PersonRecord({
- name: 'other1',
- sex: 0
- }), new PersonRecord({
- name: 'other2',
- sex: 0
- }));
如果希望自己指定資料插入的索引位置, 可以使用 insert() 函數. 它的第一個參數表示插入資料的索引位置, 可以使用 record 實例或 record 實例的陣列作為第二個參數. 插入之後, 後面的資料會自動後移. 使用範例如下:
- // 插入一個
- store.insert(3, new PersonRecord({
- name: 'other',
- sex: 0
- }));
- // 插入多個
- store.insert(3, new PersonRecord({
- name: 'other1',
- sex: 0
- }), new PersonRecord({
- name: 'other2',
- sex: 0
- }));
- store.remove(store.getAt(0));
- store.removeAll();
- store.getAt(0).set('name', 'xxx');
store 建立後, 需要呼叫 load() 函數載入資料, 載入成功才能對 store 中的資料進行操作. load() 呼叫的完整過程如下面代碼:
- store.load({
- params: {start:0, limit:20},
- callback: function(records, options, success)
- {
- Ext.Msg.alert('Info', 'Loading done!');
- },
- scope: store,
- add: true
- });
一般來說, 為了對 store 中的資料進行初始化, load() 函數只需要執行一次. 如果用 params 參數指定需要使用的參數, 以後再次執行 reload() 重新載入資料時, store 會自動使用上次 load() 中包含的params 參數內容. 如果有一些需要固定傳遞的參數, 也可以使用 baseParams 參數執行, 它是一個 JSON 物件, 裡面的資料會作為參數傳送給幕後處理, 範例代碼如下:
- store.baseParams.start=0;
- store.baseParams.limit=20;
filter() 函數用法於之前提到的 find() 相似, 範例代碼如下:
- store.filter('name', 'boy');
- store.filterBy(function(record){
- return record.get('name') == 'girl' && record.get('sex') == 1;
- });
沒有留言:
張貼留言