目标:
了解Extjs的数据模型
应用Extjs异步数据提交
对于ajaxpro的应用
介绍一个基本的设计模式
内容:
数据记录: Record
数据集合中的一个条记录,包括数据的定义和值。相当于实体类。
数据代理 Proxy
用来获取数据的代理。相当于Datasource。
数据解析器 DataReader
负责将Proxy获取的数据解析出来传换成Record并存入Store中。相当于C#的DataReader。
数据集 Store
一个保存数据的集合,类似于C#的Datatable
要建立一个数据记录类(注意不是具体一条数据),可以使用Ext.data.Record.create方法
var TopicRecord = Ext.data.Record.create([{name: 'title' }, {name: 'author', allowBlank: false },
{name: 'totalPosts', type: 'int' },{name: 'lastPost',type: 'date' }]};
按照记录格式新建一条记录
var myNewRecord = new TopicRecord(
{
title: 标题,
author: '作者',
totalPosts: 1,
lastPost: new Date()
},
读取记录:
Ext.msg.alert(myNewRecord.get('title'));//返回标题
alert(myNewRecord.data.title);
alert(myNewRecord.data[‘title’]);
alert(myNewRecord.get[’title‘]);
2.数据代理
这是最常用的proxy,通过一个http请求从远程服务器获取数据。HttpProxy最重要的配置项就是配置获取数据的url。HttpProxy不仅仅支持获取数据,它支持对数据的CRUD操作。DataProxy的api属性就是用来配置这4种操作对应的url的。如果不配置,就采用HttpProxy的url属性
取数据是connection的事,不用我们费心了,转换数据成记录集,这个是reader的事,也不用我们费心了。HttpProxy的作用事实就是二者的外观类
1 function Read3() { // arrayReader应用
2 var Myarray = [[ ' 陈建强 ' , ' 男 ' , 26 ],[ ' 张黎 ' , ' 女 ' , 25 ],[ ' 张静 ' , ' 女 ' , 27 ],[ ' 张冰 ' , ' 女 ' , 24 ]];
3 var Myrecord = Ext.data.Record.create([
4 {
5 name: ' userName ' ,
6 allowBlank: false
7 },
8 {
9 name: ' userSex '
10 },
11 {
12 name: ' userAge ' ,
13 type: ' int '
14 }
15 ]);
16 var Myproy = new Ext.data.ArrayReader({id: 2 },Myrecord);
17 var Mydata = Myproy.readRecords(Myarray);
18 var str = "" ;
19 for (var i = 0 ;i < Mydata.records.length;i ++ )
20 {
21 str = " 总条数: " + Mydata.totalRecords + " <br> " ;
22 str += " 记录编号: " + Mydata.records[i].id + " <br> " ;
23 str += " 用户名: " + Mydata.records[i].data.userName + " <br> " ;
24 str += " json: " + Mydata.records[i].json;
25 }
26 Ext.Msg.alert( " ArrayReader的应用 " ,str);
27 }
28 function Read4() { // jsonReader应用
29 var Myjson = {
30 results: 4 ,
31 rows:[
32 {
33 userName: ' 陈建强 ' ,
34 userSex: ' 男 ' ,
35 userAge: 26
36 },
37 {
38 userName: ' 张黎 ' ,
39 userSex: ' 女 ' ,
40 userAge: 25
41 },
42 {
43 userName: ' 张静 ' ,
44 userSex: ' 女 ' ,
45 userAge: 27
46 },
47 {
48 userName: ' 张冰 ' ,
49 userSex: ' 女 ' ,
50 userAge: 24
51 }
52 ]
53 };
54 var Myrecord = Ext.data.Record.create([
55 {
56 name: ' userName ' ,
57 allowBlank: false
58 },
59 {
60 name: ' userSex '
61 },
62 {
63 name: ' userAge ' ,
64 type: ' int '
65 }
66 ]);
67 var MyjsonReader = new Ext.data.JsonReader({
68 totalProperty: ' Results ' ,
69 root: ' rows ' ,
70 idProperty: ' userAge '
71 },Myrecord);
72 var Mydata = MyjsonReader.readRecords(Myjson);
73 var str = "" ;
74 for (var i = 0 ;i < Mydata.records.length;i ++ )
75 {
76 str = " 总条数: " + Mydata.totalRecords + " <br> " ;
77 str += " 记录编号: " + Mydata.records[i].id + " <br> " ;
78 str += " 用户名: " + Mydata.records[i].data.userName + " <br> " ;
79 str += " json: " + Mydata.records[i].json;
80 }
81 Ext.Msg.alert( " JsonReader的应用 " ,str);
82 }
83 function Read5() {
84 var xmlDocument;
85 if (Ext.isIE){
86 xmlDocument = new ActiveXObject( " Msxml2.FreeThreadedDOMDocument " )
87 xmlDocument.async = false ;
88 xmlDocument.resolveExternals = false ;
89 xmlDocument.load( ' MyPages/Users.xml ' );
90 }
91 else {
92 xmlDocument = ( new DOMParser()).parseFromString(str, " text/xml " );
93 }
94 var Myrecord = Ext.data.Record.create([
95 {
96 name: ' userName ' ,
97 allowBlank: false
98 },
99 {
100 name: ' userSex '
101 },
102 {
103 name: ' userAge ' ,
104 type: ' int '
105 }
106 ]);
107 var MyxmlReader = new Ext.data.XmlReader({
108 totalRecords: " results " ,
109 record: " row " , // row是节点选择器
110 id: " userAge "
111 }, Myrecord);
112 var Mydata = MyxmlReader.readRecords(xmlDocument);
113 var str = "" ;
114 for (var i = 0 ;i < Mydata.records.length;i ++ )
115 {
116 str = " 总条数: " + Mydata.totalRecords + " <br> " ;
117 str += " 记录编号: " + Mydata.records[i].id + " <br> " ;
118 str += " 用户名: " + Mydata.records[i].data.userName + " <br> " ;
119 str += " json: " + Mydata.records[i].json;
120 }
121 Ext.Msg.alert( " xmlReader的应用 " ,str);
122
123 }
3,数据存储之store
Store 可以理解为数据存储器,可以理解为客户端的小型数据表,提供缓存等功能。在ExtJS中,GridPanel,ComboBox,DataView等控件直接通过Store来获得控件中需要展现的数据。一个Store包含了多个Record,同时Store又包含了数据来源,数据解析器等相关信息。Store通过调用具体的数据解析器(DataReader)来解析指定类型或格式的数据(DataProxy),并转换成记录集的形式保存在Store中,作为其他控件的数据输入。
数据存储器由 ExtJS.Store类来定义,一个完整的数据存储器要知道数据源(DataProxy)及数据解析方式(DataReader)才能工作,在ExtJS.Store类中数据源由Proxy配置属性定义、数据解析器由reader配置属性定义
SimpleStore是专为简化读取本地数组而设计的,设置上MemoryProxy需要的data和ArrayReader需要的fields就可以使用了
SimpleStore = Store + MemoryProxy + ArrayReader
var ds = Ext.data.SimpleStore({
data: [
['id1','name1','descn1'],
['id2','name2','descn2']
],
fields: ['id','name','descn']
});
JsonStore将JsonReader和HttpProxy整合在一起,提供了一种从后台读取JSON信息的简便方法,
JsonStore = Store + HttpProxy + JsonReader
var ds = Ext.data.JsonStore({
url: 'xxx.jsp',
root: 'root',
fields: ['id','name','descn']
});
Ext.data.GroupingStore继承自Ext.data.Store,它的主要功能是可以对内部的数据进行分组,我们可以在创建Ext.data.GroupingStore时指定根据某个字段进行分组,也可以在创建实例后调用它的groupBy()函数对内部数据重新分组
var ds = new Ext.data.GroupingStore({
data: [
['id1','name1','female','descn1'],
['id2','name2','male','descn2'],
['id3','name3','female','descn3'],
['id4','name4','male','descn4'],
['id5','name5','female','descn5']
],
reader: new Ext.data.ArrayReader({
fields: ['id','name','sex','descn']
}),
groupField: 'sex',
groupOnSort: true
});