目标:

       了解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的作用事实就是二者的外观类

EXTJS数据读取对象
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
});