`
k_lb
  • 浏览: 831687 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

Ext.data库中几个常用类的原理及其使用

 
阅读更多

该项目基于.net2.0+Extjs来实现,具体的架构以后会慢慢贴出,这里只是简单介绍一下Ext.data库中几个常用的类的实现原理和使用.

Ext.data 库主要包括以下几个类:

Ext.data.Store ==>DataSet

Ext.data.Record ==>DataSet.Row

Ext.data.DataProxy ==>SqlConnection

Ext.data.DataReader ==>SqlDataAdapter

以下分别进行介绍:

1.Ext.data.Record

可以用来定义一行数据的格式,它有几个重要的属性和方法:

data:实际的数据

modified:如果dirty==true 这modified中存放的是修改前的数据否则为空

e.g:

if(dirty){var a = modified['Name']};

构造函数:

Record(Array data, [Object id])

e.g:

var a = new Ext.data.Record([

{name:'Name'},

{name:'Address'}

],{id:'Name'}) ;

其中第2个参数可以不写

等价于

var a = Ext.data.Record.create([

{name:'Name'},

{name:'Address'}

],{id:'Name'}) ;

生成一行实际数据

var record = new a({

Name:'test',

Address:'where'

});

Ext.Msg.alert('test',record.get('Name')) 输出:'test'

Ext.Msg.alert('test',record.data.Name)输出:'test'

定义好行的格式之后我们就可以生成DataProxy去获取数据

DataProxy 分为3种,我们主要使用其中的2种MemoryProxy 和HttpProxy,其中最重要的方法:

load(Object params, Ext.data.DataReader reader, Function callback, Object scope, Object arg) : void

MemoryProxy(Object data)

e.g:

MemoryProxy只可以识别数据对象的数据格式如下:

var data = [['tt','shenzhen'],['tt2','shenzhen']];

定义reader 可以又多种方法:

1.var reader= new Ext.data.ArrayReader({id:'Name'},r);

2.var reader= new Ext.data.ArrayReader({id:'Name',fields:['Name','Address']});

一般使用第2种方法,因为代码量少

DataReader ,ArrayReader ,JsonReader 的继承关系如下:
JsonReader 继承DataReader ,ArrayReader 继承JsonReader ,ArrayReader 于JsonReader 唯一的区别就是readRecords方法的实现不一样;

下面就着源码讲解一下为什么DataReader 可以用多种方法去生成

DataReader:

Ext.data.DataReader = function(meta, recordType){
/**
* This DataReader's configured metadata as passed to the constructor.
* @type Mixed
* @property meta
*/
this.meta = meta;
this.recordType = Ext.isArray(recordType) ?
Ext.data.Record.create(recordType) : recordType;
};

---------------------------------------------------------

JsonReader:

Ext.data.JsonReader = function(meta, recordType){
meta = meta || {};
Ext.data.JsonReader.superclass.constructor.call(this, meta, recordType || meta.fields);
};

JsonReader 的构造函数中调用了DataReader的构造函数就是我用黄颜色标记的地方,如果JsonReader 的Config对象中提供了fields属性则调用的方法如下:

DataReader(meta,meta.fields);

否则就只能只用使用原来Ext.data.Record.create()生成的对象去初始化DataReader(meta,r.prototype.fields);

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

proxy.load(null,reader,callback,this,{req:'123'});

function callback(Records,arg,bFlag){alert(Records.records[0].get('Name'))} 输出:'tt';

proxy的load 方法中调用了reader.readerRecords(data)来读取数据结果就是callback函数中的Records{records:[],recordsCount}:records为读出的数据的数据对象,recordsCount表示记录的行数;

当然也可以生成一个JsonReader 对象来读取数据

e.g:

var jsonReader = new Ext.data.JsonReader({
id:'Name',
root:'data',
totalProperty:'totalCount',
fields:['Name','Address']
});

var jsonData={
'totalCount':2,
'data':[
{'Name':'tt','Address':'shenzhen'},
{'Name':'tt1','Address':'shenzhen'}
]
};

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

proxy.load(null,reader,callback,this,{req:'123'});

function callback(Records,arg,bFlag){alert(Records.records[0].get('Name'))} 输出:'tt';

Ext.data库中最重要的就是Ext.data.Store ,它可以为Ext.grid.GridPanel ,Ext.form.Combox ...提供数据源

有2种Store都继承自Ext.data.Store:Ext.data.JsonStore 和Ext.data.SimpleStore

Ext.data.JsonReader 对应 Ext.data.JsonReader ;Ext.data.SimpleStore 对应 Ext.data.ArrayReader

Ext.data.Store的主要Config属性有:

url:请求数据的Url地址;

data:直接提供的数据源;

proxy:Ext.data.DataProxy(从哪里取数据);

reader:Ext.data.DataReader(取什么样的数据);

baseParams:请求时要附加的参数:{req:'123'};

以上的配置属性之间有一些联系,主要表现在url和proxy上面

现在讲解一下store中各个对象的生成关系和顺序:

1.初始化baseParams:{start:,limit:sort:dir:}
2.判断有没有直接传入数据集合==>config.data==null ;this.inlineData = data;
3.config.url !=null 同时config.proxy没有数值
就用config 的url直接生成一个this.proxy=HttpProxy();
this.proxy在后面的load()函数中会使用到,这就是为什么有时我们在配置store的时候提供了config.data 和config.reader,而没有提供config.proxy就会报错的原因
因为在load()函数中会调用Ext.data.DataProxy.load()方法

4.判断是否提供了config.reader,生成this.recordType 和this.fields

JsonStore 的构造函数源码如下:

Ext.data.JsonStore = function(c){
/**
* @cfg {Ext.data.DataReader} reader @hide
*/
/**
* @cfg {Ext.data.DataProxy} proxy @hide
*/
Ext.data.JsonStore.superclass.constructor.call(this, Ext.apply(c, {
proxy: c.proxy || (!c.data ? new Ext.data.HttpProxy({url: c.url}) : undefined),
reader: new Ext.data.JsonReader(c, c.fields)
}));
};

生成原理:

1.调用Ext.data.Store的构造函数,其中我标为黄色的语句表达的意思就是:如果提供了proxy配置属性就使用当前配置的Proxy去获取数据,没有提供则判断是否有直接数据源提供,没有则用

url配置属性去生成一个HttpProxy去获取数据,绿色语句是生成Ext.data.DataReader对象,在Store 的Load()方法会使用他去读取数据;

在这里顺便介绍一下在源码中使用最多的一种语句 (c = a||b )== (c=a==undefinde ? b:a)

---------------------------------------------------------------------

SimpleStore 的构造函数源码如下:

Ext.data.SimpleStore = function(config){
Ext.data.SimpleStore.superclass.constructor.call(this, Ext.apply(config, {
reader: new Ext.data.ArrayReader({
id: config.id
},
Ext.data.Record.create(config.fields)

)
}));
};

SimpleStore的生成原理与JsonStore大体一致,

在以上的2段代码中都要注意到的是config.fields配置属性,他们都被用来去生成Ext.data.Record对象;

现在举几个生成Store对象的例子

1.

var data =[['tt','shenzhen'],['tt2','shenzhen']];

var store = new Ext.data.SimpleStore({

data:data,

fields:['Name','Address']

});

2.

var jsonData={
'totalCount':2,
'data':[
{'Name':'tt','Address':'shenzhen'},
{'Name':'tt1','Address':'shenzhen'}
]
};

var store = new Ext.data.JsonStore({

data:jsonData,

fields:['Name','Address'],

id:'Name',

root:'data',

totalProperty:'totalCount'

});

3.

var store = new Ext.data.JsonStore({

URL:

fields:['Name','Address'],

id:'Name',

root:'data',

totalProperty:'totalCount'

});

其中以第3中方法使用最为广泛.

分享到:
评论

相关推荐

    Ext.data.Store的基本用法

    在使用`Ext.data.Store`之前,首先需要创建一个其实例。创建实例时需要指定其配置项,主要包括`proxy`和`reader`,这两个配置项分别用来定义数据来源以及如何解析这些数据。 ```javascript var data = [ ['boy', 0...

    Ext3.2的Ext.data.Store类和Ext.Ajax类的实际运用

    环境:Window XP Sp2、Tomcat 6.0、...关于Ext.data.Store类,我们可以看出:该框架提供了客户端缓存的功能--这对于我们框架系统是非常有帮助的。本示例代码注释非常详细。 阅读对象:需要使用Ext框架进行Web开发的人员

    Ext.data.Store 读取XML属性值

    `Ext.data.reader.Xml`是Ext.js中的一个阅读器,专门设计用来解析XML数据。阅读器的主要任务是从服务器返回的数据中提取字段值,并将这些值映射到模型实例上,以便`Store`能够理解并处理它们。 首先,我们需要创建...

    Ext.data专题

    **Ext.data** 是一个重要的JavaScript库组件,用于处理数据传输和管理。它定义了一系列的核心概念,包括 **Store**、**Reader** 和 **Proxy**,这些都是Ext.data的核心组成部分。通过这些概念,开发者能够轻松地管理...

    Ext.get与Ext.fly的区别

    在Ext JS框架中,`Ext.get`和`Ext.fly`是两个非常重要的方法,它们主要用于操作DOM元素。理解这两个方法之间的区别以及如何使用它们对于开发高质量、高效率的应用程序至关重要。 #### 1. Ext.get **定义**:`Ext....

    Extjs 继承Ext.data.Store不起作用原因分析及解决

    关于这个原因有很多种,我只说下我遇到的 我这样 写Store来复用的 代码如下: DocStore = Ext.extend(Ext.data.Store,{ initComponent:function(){ this.proxy = new Ext.data.HttpProxy({url:this.url}); this....

    extjs-Ext.ux.form.LovCombo下拉框

    在EXTJS框架中,`Ext.ux.form.LovCombo`是一种自定义组件,它扩展了基本的`Ext.form.field.ComboBox`,提供了更丰富的功能,尤其是针对多选和联动选择的需求。这个组件通常用于创建具有“lov”(即“Look Up Value”...

    Ext.Store的获取方法

    var store = new Ext.data.JsonStore({ // store configurations }); store.load(); ``` 然后通过`store`变量来访问和操作Store。但在使用`extend`进行类继承时,可能会将Store的定义放在一个新的组件内,例如一个...

    一个简单的Ext.Window中插入图片的例子

    在Ext JS这个强大的JavaScript框架中,`Ext.Window`是一个常用组件,用于创建浮动、可弹出的窗口。在Web应用程序中,我们常常需要在这些窗口中展示各种内容,包括文字、表格、按钮,当然还有图片。本文将详细介绍...

    Ext.tree.TreeLoader附带封装的json类

    `Ext.tree.TreeLoader`是Ext JS库中的一个组件,它负责加载和解析树形结构的数据,而JSON(JavaScript Object Notation)则是一种轻量级的数据交换格式,非常适合于在服务器和客户端之间传输数据。我们将通过实例...

    extjs中Ext.Panel和TreePanel 组件动态加载本地页面数据

    store: Ext.create('Ext.data.Store', { fields: ['name', 'value'], proxy: { type: 'ajax', url: 'data.json', // 本地数据文件路径 reader: { type: 'json', rootProperty: 'items' } }, autoLoad: ...

    Ext.Ajax.request2.x实现同步请求

    在EXTJS库中,`Ext.Ajax.request`是用于发送Ajax请求的核心方法,它支持异步和同步操作。本文将详细解析如何利用`Ext.Ajax.request`实现同步请求,并探讨其背后的原理和注意事项。 首先,我们需要理解Ajax的本质,...

    Ext.get与Ext.fly 的区别

    在EXTJS这个强大的JavaScript框架中,`Ext.get`和`Ext.fly`是两个非常重要的方法,它们都用于操作DOM元素,但它们之间存在着微妙的差异。了解这些差异对于优化代码性能和理解EXTJS的工作机制至关重要。 首先,`Ext....

    fp40ext.dll无法加载安装程序库

    标题 "fp40ext.dll无法加载安装程序库" 描述了一个常见的系统错误,涉及的是一个动态链接库(DLL)文件fp40ext.dll在尝试执行或加载时出现问题。DLL文件是Windows操作系统中的一种共享库,它包含了一系列可供多个...

    Ext.DataView 图片列表显示

    var reader = new Ext.data.JsonReader({totalProperty:'totalProperty',root:'root'},record); store = new Ext.data.Store({ proxy:proxy, reader:reader }); //尾 分页 var pagebar = new Ext....

    Ext.js教程和Ext.js API

    Ext.js 3.0的中文API提供了一个详细的类和方法参考,方便中文阅读者理解其工作原理。API文档通常包括以下内容: 1. **类结构**:列出所有可用的类,如Panel、Grid、Form等,以及它们之间的继承关系。 2. **类方法和...

    EXT.form组件

    EXT.form组件是EXT JS库中用于构建表单界面的核心组件集合。这些组件提供了一系列丰富的控件,用于创建具有不同功能的交互式表单。在EXT JS中,表单组件不仅包含基本的输入字段,还支持复杂的输入类型和验证机制。 ...

    Ext.ux.SwfUploadPanel.js

    在实际使用`Ext.ux.SwfUploadPanel.js`时,你需要在ExtJS应用程序中引入这个文件,并配置相关参数,例如服务器端处理脚本地址、允许的文件类型、最大文件大小等。然后,你可以像创建其他ExtJS组件一样,实例化...

    EXT核心API详解

    29、Ext.data.MemoryProxy类 ……… 25 30、Ext.data.ScriptTagProxy类 ………… 25 31、Ext.data.DataReader类 ……………26 32、Ext.data.ArrayReader类 …………… 26 33、Ext.data.JsonReader类 …………… 26 ...

    Ext.Array例子

    在EXTJS库中,`Ext.Array` 是一个非常重要的工具类,它提供了许多方便的静态方法,用于处理JavaScript中的数组。这些方法旨在增强原生数组的功能,提高代码的可读性和效率。`Ext.Array` 包含了排序、查找、过滤、...

Global site tag (gtag.js) - Google Analytics