- 浏览: 471296 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (190)
- ExtJS (40)
- JavaScript (16)
- Java设计模式 (13)
- Html (10)
- Tomcat (9)
- myeclipse (5)
- JSP (5)
- CSS (10)
- JS/CSS (1)
- windows (12)
- Navicat For MySQL (1)
- struts2 (6)
- Spring2.0 (1)
- Java反射机制 (5)
- hibernate (9)
- java (17)
- B/SWeb完美打印方案 (1)
- 数据库相关 (4)
- java web报表 (1)
- 报表打印 (2)
- java泛型 (1)
- Servlet (2)
- SVN (7)
- Log4j (0)
- android (3)
最新评论
-
kation733:
斯蒂芬斯蒂芬多萨法阿凡达是否阿萨德
同时开启两个Tomcat -
BlueBing:
一路的夏天 写道楼主的代码会报错吧!在前面的时候String ...
使用Java反射机制遍历实体类的属性和类型 -
ying890:
非常感谢!
Ext JS中文乱码解决方案 -
zhylandroid:
谢谢了,对我很有帮助
DatabaseMetaData开发实务(上) -
wendy.wujing:
maxHttpHeaderSize="8192&qu ...
查看Tomcat配置的端口
10.4 Ext.data.Store
Ext.data.Store是EXT中用来进行数据交换和数据交互的标准中间件,无论是Grid还是ComboBox,都是通过它实现数据读取、类型转换、排序分页和搜索等操作的。
Ext.data.Store中有一个Ext.data.Record数组,所有数据都存放在这些Ext.data. Record实例中,为后面的读取和修改操作做准备。
10.4.1 基本应用
在使用之前,首先要创建一个Ext.data.Store的实例,如下面的代码所示。
var data = [
['boy', 0],
['girl', 1]
];
var store = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.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的最基本用法。
10.4.2 对数据进行排序
Ext.data.Store提供了一系列属性和函数,利用它们对数据进行排序操作。
可以在创建Ext.data.Store时使用sortInfo参数指定排序的字段和排序方式,如下面的代码所示。
var store = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(data),
reader: new Ext.data.ArrayReader({}, PersonRecord),
sortInfo: {field: 'name', direction: 'DESC'}
});
这样,在store加载数据之后,就会自动根据name字段进行降序排列。对store使用store.setDefaultSort('name','DESC');也会达到同样效果。
也可以在任何时候调用sort()函数,比如store.sort('name', 'DESC');,对store中的数据进行排序。
如果我们希望获得store的排序信息,可以调用getSortState()函数,返回的是类似{field: "name", direction: " DESC"}的JSON对象。
与排序相关的参数还有remoteSort,这个参数是用来实现后台排序功能的。当设置为remoteSort:true时,store会在向后台请求数据时自动加入sort和dir两个参数,分别对应排序的字段和排序的方式,由后台获取并处理这两个参数,在后台对所需数据进行排序操作。remoteSort:true也会导致每次执行sort()时都要去后台重新加载数据,而不能只对本地数据进行排序。
详细的用法可以参考第2章。
10.4.3 从store中获取数据
从store中获取数据有很多种途径,可以依据不同的要求选择不同的函数。最直接的方法是根据record在store中的行号获得对应的record,得到了record就可以使用get()函数获得里面的数据了,如下面的代码所示。
store.getAt(0).get('name')
通过这种方式,我们可以遍历store中所有的record,依次得到它们的数据,如下面的代码所示。
for (var i = 0; i < store.getCount(); i++) {
var record = store.getAt(i);
alert(record.get('name'));
}
Store.getCount()返回的是store中的所有数据记录,然后使用for循环遍历整个store,从而得到每条记录。
除了使用getCount()的方法外,还可以使用each()函数,如下面的代码所示。
store.each(function(record) {
alert(record.get('name'));
});
Each()可以接受一个函数作为参数,遍历内部record,并将每个record作为参数传递给function()处理。如果希望停止遍历,可以让function()返回false。
也可以使用getRange()函数连续获得多个record,只需要指定开始和结束位置的索引值,如下面的代码所示。
var records = store.getRange(0, 1);
for (var i = 0; i < records.length; i++) {
var record = records[i];
alert(record.get('name'));
}
如果确实不知道record的id,也可以根据record本身的id从store中获得对应的record,如下面的代码所示。
store.getById(1001).get('name')
EXT还提供了函数find()和findBy(),可以利用它们对store中的数据进行搜索,如下面的代码所示。
find( String property, String/RegExp value, [Number startIndex], [Boolean anyMatch],
[Boolean caseSensitive] )
在这5个参数中,只有前两个是必须的。第一个参数property代表搜索的字段名;第二个参数value是匹配用字符串或正则表达式;第三个参数startIndex表示从第几行开始搜索,第四个参数anyMatch为true时,不必从头开始匹配;第五个参数caseSensitive为true时,会区分大小写。
如下面的代码所示:
var index = store.find('name','g');
alert(store.getAt(index).get('name'));
与find()函数对应的findBy()函数的定义格式如下:
findBy( Function fn, [Object scope], [Number startIndex] ) : Number
findBy()函数允许用户使用自定义函数对内部数据进行搜索。fn返回true时,表示查找成功,于是停止遍历并返回行号。fn返回false时,表示查找失败(即未找到),继续遍历,如下面的代码所示。
index = store.findBy(function(record, id) {
return record.get('name') == 'girl' && record.get('sex') == 1;
});
alert(store.getAt(index).get('name'));
通过findBy()函数,我们可以同时判断record中的多个字段,在函数中实现复杂逻辑。
我们还可以使用query和queryBy函数对store中的数据进行查询。与find和findBy不同的是,query和queryBy返回的是一个MixCollection对象,里面包含了搜索得到的数据,如下面的代码所示。
alert(store.query('name', 'boy'));
alert(store.queryBy(function(record) {
return record.get('name') == 'girl' && record.get('sex') == 1;
}));
10.4.4 更新store中的数据
可以使用add(Ext.data.Record[] records)向store末尾添加一个或多个record,使用的参数可以是一个record实例,如下面的代码所示。
store.add(new PersonRecord({
name: 'other',
sex: 0
}));
Add()的也可以添加一个record数组,如下面的代码所示:
store.add([new PersonRecord({
name: 'other1',
sex: 0
}), new PersonRecord({
name: 'other2',
sex: 0
})]);
Add()函数每次都会将新数据添加到store的末尾,这就有可能破坏store原有的排序方式。如果希望根据store原来的排序方式将新数据插入到对应的位置,可以使用addSorted()函数。它会在添加新数据之后立即对store进行排序,这样就可以保证store中的数据有序地显示,如下面的代码所示。
store.addSorted(new PersonRecord({
name: 'lili',
sex: 1
}));
store会根据排序信息查找这条record应该插入的索引位置,然后根据得到的索引位置插入数据,从而实现对整体进行排序。这个函数需要预先为store设置本地排序,否则会不起作用。
如果希望自己指定数据插入的索引位置,可以使用insert()函数。它的第一个参数表示插入数据的索引位置,可以使用record实例或record实例的数组作为参数,插入之后,后面的数据自动后移,如下面的代码所示。
store.insert(3, new PersonRecord({
name: 'other',
sex: 0
}));
store.insert(3, [new PersonRecord({
name: 'other1',
sex: 0
}), new PersonRecord({
name: 'other2',
sex: 0
})]);
删除操作可以使用remove()和removeAll()函数,它们分别可以删除指定的record和清空整个store中的数据,如下面的代码所示。
store.remove(store.getAt(0));
store.removeAll();
store中没有专门提供修改某一行record的操作,我们需要先从store中获取一个record。对这个record内部数据的修改会直接反映到store上,如下面的代码所示。
store.getAt(0).set('name', 'xxxx');
修改record的内部数据之后有两种选择:执行rejectChanges()撤销所有修改,将修改过的record恢复到原来的状态;执行commitChanges()提交数据修改。在执行撤销和提交操作之前,可以使用getModifiedRecords()获得store中修改过的record数组。
与修改数据相关的参数是pruneModifiedRecords,如果将它设置为true,当每次执行删除或reload操作时,都会清空所有修改。这样,在每次执行删除或reload操作之后,getModifiedRecords()返回的就是一个空数组,否则仍然会得到上次修改过的record记录。
10.4.5 加载及显示数据
store创建好后,需要调用load()函数加载数据,加载成功后才能对store中的数据进行操作。load()调用的完整过程如下面的代码所示。
store.load({
params: {start:0,limit:20},
callback: function(records, options, success){
Ext.Msg.alert('info', '加载完毕');
},
scope: store,
add: true
});
q params是在store加载时发送的附加参数。
q callback是加载完毕时执行的回调函数,它包含3个参数:records参数表示获得的数据,options表示执行load()时传递的参数,success表示是否加载成功。
q Scope用来指定回调函数执行时的作用域。
q Add为true时,load()得到的数据会添加在原来的store数据的末尾,否则会先清除之前的数据,再将得到的数据添加到store中。
一般来说,为了对store中的数据进行初始化,load()函数只需要执行一次。如果用params参数指定了需要使用的参数,以后再次执行reload()重新加载数据时,store会自动使用上次load()中包含的params参数内容。
如果有一些需要固定传递的参数,也可以使用baseParams参数执行,它是一个JSON对象,里面的数据会作为参数发送给后台处理,如下面的代码所示。
store.baseParams.start = 0;
store.baseParams.limit = 20;
为store加载数据之后,有时不需要把所有数据都显示出来,这时可以使用函数filter和filterBy对store中的数据进行过滤,只显示符合条件的部分,如下面的代码所示。
filter( String field, String/RegExp value, [Boolean anyMatch],
[Boolean caseSensitive] ) : void
filter()函数的用法与之前谈到的find()相似,如下面的代码所示。
store.filter('name', 'boy');
对应的filterBy()与findBy()类似,也可以在自定义的函数中实现各种复杂判断,如下面的代码所示。
store.filterBy(function(record) {
return record.get('name') == 'girl' && record.get('sex') == 1;
});
如果想取消过滤并显示所有数据,那么可以调用clearFilter()函数,如下面的代码所示。
store.clearFilter();
如果想知道store上是否设置了过滤器,可以通过isFiltered()函数进行判断。
10.4.6 其他功能
除了上面提到的数据获取、排序、更新、显示等功能外,store还提供了其他一些功能函数。
collect( String dataIndex, [Boolean allowNull], [Boolean bypassFilter] ) : Array
collect函数获得指定的dataIndex对应的那一列的数据,当allowNull参数为true时,返回的结果中可能会包含null、undefined或空字符串,否则collect函数会自动将这些空数据过滤掉。当bypassFilter参数为true时,collect的结果不会受查询条件的影响,无论查询条件是什么都会忽略掉,返回的信息是所有的数据,如下面的代码所示。
alert(store.collect('name'));
这样会获得所有name列的值,示例中返回的是包含了'boy'和'girl'的数组。
getTotalCount()用于在翻页时获得后台传递过来的数据总数。如果没有设置翻页,get- TotalCount()的结果与getCount()相同,都是返回当前的数据总数,如下面的代码所示。
alert(store.getTotalCount());
indexOf(Ext.data.Record record)和indexOfId(String id)函数根据record或record的id获得record对应的行号,如下面的代码所示。
alert(store.indexOf(store.getAt(1)));
alert(store.indexOfId(1001));
loadData(object data, [Boolean append])从本地JavaScript变量中读取数据,append为true时,将读取的数据附加到原数据后,否则执行整体更新,如下面的代码所示。
store.loadData(data, true);
Sum(String property, Number start, Number end):Number用于计算某一个列从start到end的总和,如下面的代码所示。
alert(store.sum('sex'));
如果省略参数start和end,就计算全部数据的总和。
store还提供了一系列事件(见表10-1),让我们可以为对应操作设定操作函数。
表10-1 store提供的事件
事件名参 数
add( Store this, Ext.data.Record[] records, Number index )
beforelaod( Store this, Object options )
clear( Store this )
datachanged( Store this )
load( Store this, Ext.data.Record[] records, Object options )
loadexception()
metachange( Store this, Object meta. )
remove( Store this, Ext.data.Record record, Number index )
update( Store this, Ext.data.Record record, String operation )
发表评论
-
功能: 用户点击grid的表头菜单显示/隐藏列,拉动列、重新刷新页面后保留。
2011-01-05 11:56 2362var grid = new Ext.grid.GridPa ... -
fieldSet组件的基本用法 将fieldSet上的边框去掉或者改变内边距
2010-05-29 09:58 10541先把fieldSet简单的回忆下: fieldset:对表单进 ... -
ext grid 没有数据时不显示横向滚动条的解决办法
2010-05-28 14:18 2662EXT Grid 没有数据时不显示横向滚动条的解决办法: t ... -
ExtJS中动态设置TextField的readOnly属性
2010-04-28 14:49 2418假设 textField, 它的 id = 'textFiel ... -
Ext监控回车按键
2010-03-06 11:25 2394listeners : {specialkey : funct ... -
Ext.Ajax类
2010-03-05 10:35 1919Ext.Ajax类Ext.Ajax类是一个简单而清晰的XHR封 ... -
Ext JS 键映射:键盘作为第一类操作对象
2010-02-26 15:07 2289Ext.KeyMap Ext提供几个不同的组件,支持键盘导航, ... -
如何在服务器端 读取Ext.ux.UploadDialog上传的文件?
2009-12-10 17:09 2223问题已经解决。 1。要导入 commons.io.jar包 ... -
ext 多文件上传控件 Ext.ux.UploadDialog 使用中的问题
2009-12-10 17:03 3323Ext.ux.UploadDialog 像ext一 ... -
Ext.data专题五:常用proxy之MemoryProxy
2009-08-26 14:44 3951MemoryProxy只能从JavaScript对象获得数据, ... -
Ext.data专题四:Ext.data.Store
2009-08-26 14:42 2821Ext.data.Store是EXT中用来进行数据交换和数据交 ... -
Ext.data专题三:Ext.data.Record
2009-08-26 14:40 5340Ext.data.Record就是一个设 ... -
Ext.data专题二:Ext.data.Connection
2009-08-26 14:38 1431Ext.data.Connection是对Ext.li ... -
Ext.data专题一:Ext.data简介
2009-08-26 14:36 1279Ext.data在命名空间中定义了一系列store、reade ... -
EXT核心API详解(十一)_Ext.data.Store/GroupingStore/JsonStore/SimpleStore
2009-07-03 17:17 5647Ext.data.Storestore是一个为 ... -
《Ext实战》节选:自定义单元格的显示格式
2009-07-02 14:49 1338有时候,需要在Grid中显示一个链接,或根据数字的大小显示不同 ... -
ext afteredit详解
2009-07-02 09:48 2410grid.on("afteredit",a ... -
Ext.form.ComboBox 属性详解及使用方法介绍和级联使用
2009-06-27 16:18 2451Ext.form.ComboBox 属性详解(见注释)及使用方 ... -
ext_comboBox二级级联下拉框
2009-06-27 16:11 1807Ext.onReady(function(){ ... -
ExtJS 给textfield赋值的方法总结
2009-06-25 15:21 3321var value="值"; (1) f ...
相关推荐
《深入浅出Ext_JS:数据存储与传输》 在Web应用开发中,数据的存储与传输是核心环节,尤其在富客户端(Rich Internet Application, RIA)开发中,JavaScript库Ext JS提供了强大的数据管理功能。本文将围绕Ext JS的...
《深入浅出Ext JS》是Ext JS领域内的经典著作,由浅入深、循序渐进地对Ext JS各方面的知识进行了全面而系统的阐述。全书由一个可以引领读者快速入门的“Hello World”示例开篇,紧接着对Ext JS的事件、核心组件、...
目录 第1章EXT概述 第2章EXT框架基础 第3章表格控件 第4章表单与输入控件 第5章树形结构 第6章拖放 第7章弹出窗口 第8章布局 第9章工具栏和菜单 第10章数据存储与传输 第11章实用工具
全书由一个可以引领读者快速入门的“hello world”示例开篇,紧接着对ext js的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具和扩展等进行了详细讲解,最后以一...
全书由一个可以引领读者快速入门的“hello world”示例开篇,紧接着对ext js的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具和扩展等进行了详细讲解,最后以一...
全书由一个可以引领读者快速入门的“hello world”示例开篇,紧接着对ext js的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具和扩展等进行了详细讲解,最后以一...
《深入浅出ExtJS》是ExtJS领域内的经典著作,由浅入深、循序渐进地对ExtJS各方面的知识进行了全面而系统的阐述。全书由一个可以引领读者快速入门的“HelloWorld”示例开篇,紧接着对ExtJS的事件、核心组件、表格和...
深入浅出EXT JS 书中源码 书籍目录如下: 1 EXT书中概述 2 EXT框架基础 3 表格空间 4 表单输入空间 5 树形结构 6 拖放 7 弹出窗口 8 布局 9 工具栏和菜单 10 数据存储和传输 11 使用工具 12 一个完整的EXT应用 13 ...
全书由一个可以引领读者快速入门的“hello world”示例开篇,紧接着对ext js的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具和扩展等进行了详细讲解,最后以一...
全书由一个可以引领读者快速入门的“hello world”示例开篇,紧接着对ext js的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具和扩展等进行了详细讲解,最后以一...
全书由一个可以引领读者快速入门的“hello world”示例开篇,紧接着对ext js的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具和扩展等进行了详细讲解,最后以一...
全书由一个可以引领读者快速入门的“hello world”示例开篇,紧接着对ext js的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具和扩展等进行了详细讲解,最后以一...
在“ExtJS深入浅出介绍之数据存储与传输”这一主题中,我们将深入探讨ExtJS如何处理后台数据的存储和交换。 一、数据存储 1. **Store(数据存储)**:在ExtJS中,Store是数据的核心管理器,用于存储和管理数据集。...
第1章 EXT概述 1 第2章 EXT框架基础 11 第3章 表格控件 28 第4章 表单与输入控件 ...第10章 数据存储与传输 230 第11章 实用工具 256 第12章 一个完整的EXT应用 317 第13章 通过Ext Framework合理地应用EXT 339
目录 第1章EXT概述 第2章EXT框架基础 第3章表格控件 第4章表单与输入控件 第5章树形结构 第6章拖放 第7章弹出窗口 第8章布局 第9章工具栏和菜单 第10章数据存储与传输 第11章实用工具
目录 第1章EXT概述 第2章EXT框架基础 第3章表格控件 第4章表单与输入控件 第5章树形结构 第6章拖放 第7章弹出窗口 第8章布局 第9章工具栏和菜单 第10章数据存储与传输 第11章实用工具
本书是《深入浅出Ext Js》的第2版,涵盖了EXT 3.x的新特性,并对上一版进行增补。书中详细讲述了EXT的事件、核心组件、表格和表单等各种控件、树形结构、拖放、弹出窗口、布局、数据存储和传输、实用工具等内容,每...
深入浅出EXTJS 的PDF 文档无疑是一个宝贵的资源,适合那些希望深入了解该框架的开发者。以下是对文档中提到的一些关键知识点的详细解释: 1. **Ext.data**:EXTJS 的数据模块是其核心组件之一,它提供了一种在...