extJS 中 ext.data 介紹


ext.data 最主要的功能是獲取和組織數據結構,並和特定控件聯系起來,於是,Ext.data成了數據的來源,負責顯示數據。

Ext.data在命名空間中定義了一系列store、reader和proxy。Grid和ComboxBox都是以Ext.data為媒介獲取數據的,它包含異步加載、類型轉換、分頁等功能。

Ext.data默認支持Array、JSON、XML等數據格式,可以通過Memory、HTTP、ScriptTag等方式獲得這些格式的數據。如果要實現新的協議和新的數據結構,只需要擴展reader和proxy即可。

DWRProxy就實現了自身的proxy和reader,讓EXT可以直接從DWR獲得數據. 

DataProxy:獲取想要的數據,通過他能得到來自不同地方的數據,如數組、遠程服務器,並組織成不同的格式。 

DataReader:定義數據項的邏輯結構,一個數據項有很多列,每列的名稱是什么,分別是什么數據類型,都由該類來定義。另外,還負責對不同格式的數據進行讀取和解析。 

Store:存儲器,用於整合 Proxy 和 Reader,控索取數據時通常和他打交道。 

 

1. 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處理。

ExtJs之所以能異步請求數據,全依賴於Ext.data.Connection.  而ExtAjax只不過是它的一個實例罷了。 

全  稱:Ext.data.Connection
命名空間:Ext.data
定義 於:Connection.js
類  名:Connection
子  類:Ajax
父  類:Observable

  這個類封裝了到頁面所在主機的連接,允許通過一個配置好的URL來請求數據,也可以臨時在請求時傳遞一個URL。

  通過這個類獲得的請求都是異步的,並且馬上返回,調用request后,它並不馬上返回數據,要處理數據,要在調用request時傳入的options對象中,配置callback或者是success、failure。這三個是回調函數。其區別將在下文具體交待。當然,你也可以使用Connection的事件處理來做一些事情。

  注意:如果你是要上傳文件,你的回調、事件處理函數將不會獲得通常意義上的response對象。上傳通過IFrame來捕獲,所以就沒有XMLHttpRequest了。這時,response還是被創建,不過,它的responseText等於IFrame的document.innerHTML,responseXML等於IFrame的document中的xml數據。當然,這個前提是它們存在的時候。


  這意味着必面回一個合法的XML或HTML document。如果返回的是JSON數據,那么建議你把數據放到<textarea>標記中,返回時通過正則表達式從responseText中取出來了。如果返回的是XML數據,建議放到CDATA里面,通過標准DOM方法從responseXMl中取得數據。

  

2. Ext.data.Record

Ext.data.Record就是一個設定了內部數據類型的對象,它是Ext.data.Store的最基本組成部分。如果把Ext.data.Store看作是一張二維表,那么它的每一行就對應一個Ext.data.Record實例。

Ext.data.Record的主要功能是保存數據,並且在內部數據發生改變時記錄修改的狀態,它還可以保留修改之前的原始值。我們使用Ext.data.Record時通常都是由create()函數開始,首先用create()函數創建一個自定義的Record類型,如下面的代碼所示。

var PersonRecord=Ext.data.Record.create([
  {name:'name',type:'string'},
  {name:'sex',type:'int'}
]);

  PersonRecord就是我們定義的新類型,包含字符串類型的name和整數類型的sex兩個屬性,然后我們使用new關鍵字創建PersonRecord的實例,如下面的代碼所示。

 

3. Ext.data.Store

Ext.data.Store是EXT中用來進行數據交換和數據交互的標准中間件,無論是Grid還是ComboBox,都是通過它實現數據讀取、類型轉換、排序分頁和搜索等操作的.

Ext.data.Store中有一個Ext.data.Record數組,所有數據都存放在這些Ext.data.Record實例中,為后面的讀取和修改操作做准備.

在使用之前,首先要創建一個Ext.data.Store的實例,如下面的代碼所示。

var data=[['boy',0],['girl',1]];
var store=newExt.data.Store({
  proxy:newExt.data.MemoryProxy(data),
  reader:newExt.data.ArrayReader({},PersonRecord)
}); store.load()

每個store最少需要兩個組件的支持,分別是proxy和reader,proxy用於從某個途徑讀取原始數據,reader用於將原始數據轉換成Record實例。

這里我們使用的是Ext.data.MemoryProxy和Ext.data.ArrayReader,將data數組中的數據轉換成對應的幾個PersonRecord實例,然后放入store中。store創建完畢之后,執行store.load()實現這個轉換過程。

經過轉換之后,store里的數據就可以提供給Grid或ComboBox使用了,這就是Ext.data.Store的最基本用法。
Ext.data.Store提供了一系列屬性和函數,利用它們對數據進行排序操作。
可以在創建Ext.data.Store時使用sortInfo參數指定排序的字段和排序方式,如下面的代碼所示。

 

 4.Ext.data:常用proxy之MemoryProxy、HttpProxy、ScriptTagProxy 

Ext.data. DataProxy 就是來源這樣一種靈感。  

Ext.data.DataProxy  是獲取數據的代理,數據可能來自於內存,可能來自於同一域的遠程服務器數據,更有可能來自於不同域的遠程服務器數據。  

但是,在實際應用中,我們不會直接使用  Ext.data.DataProxy,而是使用他的子類: MemoryProxy、HttpProxy 和 ScriptTagProxy,他們的作用分別是: 

 MemoryProxy:獲取來自內存的數據,可以是數組、json 或者 xml。 

 HttpProxy:使用 HTTP 協議通過 ajax 從遠程服務器獲取數據的代理,需要指定 url。 

 ScriptTagProxy:功能和 HttpProxy 一樣,但支持跨域獲取數據,   是實現時有點偷雞摸狗。 

 

 5. Ext.data 常用Reader

 從proxy中讀取的數據需要進行解析,這些數據轉換成Record數組后才能提供給Ext.data.Store使用。

 

 

6.Ext.data.Store

實際開發時,並不需要每次都對proxy、reader、store這三個對象進行配置,EXT為我們提供了幾種可選擇的整合方案。

A:  SimpleStore = Store + MemoryProxy  + ArrayReader

var ds=Ext.data.SimpleStore({
    data:[['id1','name1','descn1'],['id2','name2','descn2']],
  fields:['id','name','descn']
});

SimpleStore是專為簡化讀取本地數組而設計的,設置上MemoryProxy需要的data和ArrayReader需要的fields就可以使用了。

 

B: JsonStore = Store +HttpProxy + JsonReader

var ds = Ext.data.JsonStore({
     url: 'xxx.jsp',
     root: 'root',
     fields: ['id', 'name', 'descn']    
});

JsonStore將JsonReader和HttpProxy整合在一起,提供了一種從后台讀取JSON信息的簡便方法,大多數情況下可以考慮直接使用它從后台讀取數據.

 

C:Ext.data.GroupingStore對數據進行分組

Ext.data.GroupingStore繼承自Ext.data.Store,它的主要功能是可以對內部的數據進行分組,我們可以在創建Ext.data.GroupingStore時指定根據某個字段進行分組,也可以在創建實例后調用它的groupBy()函數對內部數據重新分組,如下面的代碼所示。

var ds=newExt.data.GroupingStore({
    data:[['id1','name1','female','descn1'],['id2','name2','male','descn2'],['id3','name3','female','descn3'],['id4','name4','male','descn4'],['id5','name5','female','descn5']],
    reader:newExt.data.ArrayReader({
        fields:['id','name','sex','descn']
    }),     groupField:
'sex',
    groupOnSort:true
});

上例中,我們使用groupField作為參數,為Ext.data.Grouping設置了分組字段,另外還設置了groupOnSort參數,這個參數可以保證只有在進行分組時才會對Ext.data.Grouping-Store內部的數據進行排序。如果采用默認值,就需要手工指定sortInfo參數,從而指定默認的排序字段和排序方式,否則就會出現錯誤。
創建Ext.data.GroupingStore的實例之后,我們還可以調用groupBy()函數重新對數據進行分組。因為我們設置了groupOnSort:true,所以在重新分組時,EXT會使用分組的字段對內部數據進行排序。如果不希望對數據進行分組,也可以調用clearGrouping()函數清除分組信息,如下面的代碼所示。
  ds.groupBy('id');ds.clearGrouping();

 

7. ExtAjax

ExtAjax的基本用法如下:

ExtAjax.request({
     url: '07-01.txt',
     success: function(response){
           Ext.Msg.alert("成功!", response.responseText);
     },
     failure: function(response){
           Ext.Msg.alert("失敗!", response.responseText);
     },
     params: { name : 'value'} 
});        

這里調用的是Ext.Ajax的request函數,它的參數是一個JSON對象,具體如下所示。qurl參數表示將要訪問的后台網址。

q   success參數表示響應成功后的回調函數。

上例中我們直接從response取得返回的字符串,用Ext.Msg.alert顯示出來。

q   failure參數表示響應失敗后的回調函數。
注意,這里的響應失敗並不是指數據庫操作之類的業務性失敗,而是指HTTP返回404或500錯誤,請不要把HTTP響應錯誤與業務錯誤混淆在一起。
q   params參數表示請求時發送到后台的參數,既可以使用JSON對象,也可以直接使用
"name=value"形式的字符串。
上面的示例可以在10.store/07-01.html中找到。
Ext.Ajax直接繼承自Ext.data.Connection,不同的是,它是一個單例,不需要用new創建實例,可以直接使用。在使用Ext.data.Connection前需要先創建實例,因為Ext.data.Connection是為了給Ext.data中的各種proxy提供Ajax功能,分配不同的實例更有利於分別管理。Ext.Ajax為用戶提供了一個簡易的調用接口,實際使用時,可以根據自己的需要進行選擇。

 

8. Ext.lib.Ajax  更底層的ajax封裝

其實Ext.Ajax和Ext.data.Connection的內部功能實現都是依靠Ext.lib.Ajax來完成的,在Ext.lib.Ajax下面就是各種底層庫的Ajax了。
如果使用Ext.lib.Ajax實現以上的功能,就需要寫成下面的形式,如下面的代碼所示。

Ext.lib.Ajax.request(
    'POST',
    '07-01txt',
    {
      success:function(response){
           Ext.Msg.alert('成功',response.responseText);
      },
      failure:function(){
           Ext.Msg.alert('失敗',response.responseText);
      }
},
'data='+encodeURIComponent(Ext.encode({name:'value'}))
);

我們可以看到,使用Ext.lib.Ajax時需要傳遞4個參數,分別為method、url、callback和params。它們的含義與Ext.Ajax中的參數都是一一對應的,唯一沒有提到過的method參數表示請求HTTP的方法,它也可以在Ext.Ajax中使用method:'POST'的方式設置。

 

 

來源: http://wenku.baidu.com/link?url=vA84T-2kDhlUi_DGQ5DOGs2rOCYIrfPmkXxx8rTrWF797QlIPK6m7JpjQIOcimFSwFJO3A8_Yzj97ouFB9_uz-lzS4E5iLj8fi3vCKdy-Q7


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM