ExtJS 常用Reader

10.6 常用Reader

1.  ArrayReader

2.  JsonReader

3.  XmlReader

 

10.6.1 ArrayReader

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

ArrayReader的作用是從二維數組裏依次讀取數據,然後生成對應的Record。默認情況下是按列順序讀取數組中的數據,不過你也可以考慮用mapping指定record與原始數組對應的列號。ArrayReader的用法很簡單,但缺點是不支持分頁。使用二維數組的方式如下面的代碼所示:

var data = [

['id1','name1','descn1'],

['id2','name2','descn2']

];

對應的ArrayReader如下面的代碼所示。

var reader = new Ext.data.ArrayReader({

id:1

},[

{name:'name',mapping:1},

{name:'descn',mapping:2},

{name:'id',mapping:0},

]);

我們演示的是字段順序不一致的情況,如果字段順序和列順序一致,就不用額外配置mapping

 

10.6.2 JsonReader

JavaScript中,JSON是一種非常重要的數據格式,key:value的形式比XML那種複雜的標籤結構更容易理解,代碼量也更小,很多人傾向於使用它作爲EXT的數據交換格式。爲JsonReader準備的JSON數據如下面的代碼所示:

var data = {

id:0,

totalProperty:2,

successProperty:true,

root:[

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

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

]

};

與數組相比,JSON的最大優點就是支持分頁,我們可以使用totalProperty參數表示數據的總量。successProperty參數是可選的,可以用它判斷當前請求是否執行成功,進而判斷是否進行數據加載。在不希望JsonReader處理響應數據時,可以把successProperty設置成false

現在來討論一下JsonReader,看看它是如何與上面的JSON數據對應的,如下面的代碼所示。

var reader = new Ext.data.JsonReader({

successProperty: "successproperty",

totalProperty: "totalProperty",

root: "root",

id: "id"

}, [

{name:'id',mapping:'id'},

{name:'name',mapping:'name'},

{name:'descn',mapping:'descn'}

]);

上例中的對應方式不夠簡潔,因爲namemapping部分的內容是相同的,其實這裏的mapping可以省略,默認會用name參數從JSON中獲得對應的數據。如果不想與JSON裏的名字一樣,也可以使用mapping修改。不過,mapping在這裏還有其他用途,如代碼清單10-3所示:

代碼清單10-3 JsonReader設置mapping進行數據映射

var data = {

id:0,

totalProperty:2,

successProperty:true,

root:[

{id:'id1',name:'name1',descn:'descn1',person:{

id:1,name:'man',sex:'male'

}},

{id:'id2',name:'name2',descn:'descn2',person:{

id:2,name:'woman',sex:'female'

}}

] };

var reader = new Ext.data.JsonReader({

successProperty: "successproperty",

totalProperty: "totalProperty",

root: "root",

id: "id"

}, [

'id','name','descn',

{name:'person_name',mapping:'person.name'},

{name:'person_sex',mapping:'person.sex'}

]);

在上面的代碼中,我們使用JSON支持更復雜的嵌套結構,其中的person對象自身就擁有idnamesex等屬性。在JsonReader中可以用mapping把這些嵌套的內部屬性映射出來,賦予對應的record,而其他字段都不變。

 

10.6.3 XmlReader

XML是非常通用的數據傳輸格式,XmlReader使用的XML格式的數據如代碼清單10-4所示。

代碼清單10-4 XmlReader使用的XML格式的數據

<?xml version="1.0" encoding="utf-8"?>

<dataset>

<id>1</id>

<totalRecords>2</totalRecords>

<success>true</success>

<record>

<id>1</id>

<name>name1</name>

<descn>descn1</descn>

</record>

<record>

<id>2</id>

<name>name2</name>

<descn>descn2</descn>

</record>

</dataset>

這裏一定要用dataset作爲XML根元素。再讓我們看一下如何對XmlReader進行配置,從而讀取上面示例中的XML數據,如下面的代碼所示:

var reader = new Ext.data.XmlReader({

totalRecords: 'totalRecords',

success: 'success',

record: 'record',

id: "id"

}, ['id','name','descn']);

XmlReader使用的參數與之前介紹的JsonReader有些不同,我們可以看到這裏用到了totalRecordsrecord兩個參數,其中totalRecords用來指定從’totalRecords’標籤裏獲得後臺數據總數,record則表示XML中放在record標籤裏的數據是我們需要顯示的結果數據。其他兩個參數successid的含義和JsonReader中對應的參數相似,分別用來判斷操是否成功和這次返回的id。因爲XML中的標籤和reader裏需要的名字是相同的,所以簡化了配置,將

[{name:’id’},{name:’name’},{name:’descn’}]直接寫成了[‘id’,’name’,’descn’]

因爲XmlReader不能將JavaScript中的字符串自動解析成XML格式的數據,因此我們需要利

用其他方法進行演示。參考localXHR.js中構造XML的方式,我們有了下面的解決方案,如代

碼清單10-5所示:

代碼清單10-5 通過本地字符串構造XML對象

var data = "<?xml version='1.0' encoding='utf-8'?>" +

"<dataset>" +

"<id>1</id>" +

"<totalRecords>2</totalRecords>" +

"<success>true</success>" +

"<record>" +

"<id>1</id>" +

"<name>name1</name>" +

"<descn>descn1</descn>" +

"</record>" +

"<record>" +

"<id>2</id>" +

"<name>name2</name>" +

"<descn>descn2</descn>" +

"</record>" +

"</dataset>";

var xdoc;

if(typeof(DOMParser) == 'undefined'){

xdoc = new ActiveXObject("Microsoft.XMLDOM");

xdoc.async="false";

xdoc.loadXML(data);

}else{

var domParser = new DOMParser();

xdoc = domParser.parseFromString(data, 'application/xml');

domParser = null;

}

var proxy = new Ext.data.MemoryProxy(xdoc);

var reader = new Ext.data.XmlReader({

totalRecords: 'totalRecords',

success: 'success',

record: 'record',

10.7 高級store 24513

id: "id"

}, ['id','name','descn']);

var ds = new Ext.data.Store({

proxy: proxy,

reader: reader

});

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