ExtJs开发教程_001_Ext.data.Store使用方法详解

本文深入介绍了ExtJS中的Store组件及其使用方法。Store作为数据源,负责从服务器获取数据并将其转换为Model实例,供网格等展示组件使用。文章详细讲解了Store的配置选项,如数据模型定义、数据代理配置等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



这个组件继承自Ext.data.AbstractStore

 本篇讲解了如何构造并且做一些基本使用

下面是他的属性列表

[java]  view plain  copy
  1. autoLoad //是否自动加载  
  2. autoSync//是否自动同步  
  3. buffered//允许缓冲(官方有个5000条数据的例子可以参看)  
  4. clearOnPageLoad//是否在加载新数据的时候清空旧数据  
  5. clearRemovedOnLoad//加载的时候把删除掉的数据彻底删除(所谓删除掉的数据是指store.remove())  
  6. data//数据  
  7. fields//解析数据的字段  
  8. filters//过滤器(可以参看Ext.util.Filter和Ext.ux.grid.filter.Filter)  
  9. groupDir  
  10. groupField//用哪一个字段分组  
  11. leadingBufferZone//缓冲的情况下,最多缓冲多少行  
  12. listeners//监听器,可以指定各种on事件  
  13. model//解析数据的模型,模型可以代替proxy和fields配置  
  14. pageSize//每页显示多少条数据  
  15. proxy//数据代理(其实就是发送ajax来请求数据用的)  
  16. purgePageCount//多少页清除一次缓存数据(具体是和缓冲结合使用,本文不介绍缓冲)  
  17. remoteFilter//这个属性会往服务器发送过滤条件  
  18. remoteGroup//往服务器发送分组条件(同上,做法就是表单参数提交到后台)  
  19. remoteSort//往后台发送排序条件  
  20. sortOnFilter//排序的时候进行过滤  
  21. storeId//唯一标示,让Ext.data.StoreManager来管理用的  
  22. trailingBufferZone//缓冲多少条  

[java]  view plain  copy
  1. // 本页的全局pageSize  
  2. var PAGESIZE = 20;  
  3.    
  4. var demoStore = Ext.create('Ext.data.Store', {  
  5.            // fields一定要明确指定type,这样有很多好处,比如filter能直接设为true,便会默认按照store-fields设置好的type来确定filter的类型。  
  6.            fields : [{  
  7.                      name : 'primaryKey',  
  8.                      type : 'int'  
  9.                   },{  
  10.                      name : 'price',  
  11.                      type : 'float'  
  12.                   }, {  
  13.                      name : 'productName',  
  14.                      type : 'string'  
  15.                   }, {  
  16.                      name : 'title',  
  17.                      type : 'string'  
  18.                   }, {  
  19.                      name : 'buyDate',  
  20.                      type : 'date',  
  21.                      dateFormat : 'Y-m-d'// 此处可以避免IE下日期出现错误nan  
  22.                   }],  
  23.            // 数据代理服务  
  24.            proxy : {  
  25.               type : 'ajax',// 使用ajax请求  
  26.                url :'/read/demo/product.action',// 请求后台读取数据的地址  
  27.               // 读取数据的工具(数据代理)  
  28.               reader : {  
  29.                   // 读取方式按照json字符串格式读取  
  30.                   type : 'json',  
  31.                   // json解析成js对象之后读取所有数据(通常是数组)的属性名称。  
  32.                   root : 'root',  
  33.                   // json解析成js对象之后读取数据总条数的属性名称  
  34.                   totalProperty : 'totalProperty'  
  35.               }  
  36.            },  
  37.            // 自动加载  
  38.            autoLoad : true,  
  39.            // 每页显示多少条  
  40.            pageSize : PAGESIZE  
  41.        });  
  42.   <pre name="code" class="plain">// 商品grid  
  43.        Var demoGrid = Ext.create('Ext.grid.Panel', {  
  44.                   // 不要边框能好看一些  
  45.                   border : false,  
  46.                   //用来进行选择的选择器  
  47.                   selModel : Ext.create('Ext.selection.CheckboxModel'),  
  48.                   // 所使用的数据源  
  49.                   store : renYuanStore,  
  50.                   // 创建列详细可以参看renYuanColumns函数  
  51.                   columns : renYuanColumns(),  
  52.                   // 需要分页、全显示按钮  
  53.                   pageChange : true,  
  54.                   // 底部toolbar,不需要进行后处理。所以使用“匿名类”  
  55.                   bbar : [{  
  56.                    // 控件类型pagingtoolbar  
  57.                             xtype : 'pagingtoolbar',  
  58.                    // 这个属性好像在extAPI中没写,但是不写还不行。能控制ProgressBarPager。不然ProgressBarPager会出bug  
  59.                             pageSize : PAGESIZE,  
  60.                   // 所使用的数据源  
  61.                             store : renYuanStore,  
  62.                  // 因为Ext.ux.LiveSearchGridPanel默认把tbar和bbar占用了。所以只能使用dockedItems添加toolbar  
  63.                              dock : 'bottom',  
  64.                   // 插件,使用ProgressBarPager插件,显示进度条  
  65.                             plugins : Ext.create('Ext.ux.ProgressBarPager')  
  66.                          }],  
  67.                   // 添加双击编辑事件监听器  
  68.                   listeners : {  
  69.                      itemdblclick : function() {  
  70.                 // editBtn是编辑按钮。此处做法目的是双击数据进行编辑  
  71.                          editBtn.handler();  
  72.                      }  
  73.                   }  
  74.               });  

该组件相当于一个数据源,能够给很多呈现数据的组件提供数据。

核心工作过程是:

首先请求后台读取数据,接受后台返回的数据(其实就是个字符串)

然后按照指定格式解析数据。通常默认格式为json

我们可以自定义解析规则。详细参看Ext.data.reader.Reader

最后把解析好的数据转换成Ext.data.Model实例

我们可以自定义模型。

[java]  view plain  copy
  1. Ext.define('User', {  
  2.     extend:'Ext.data.Model',  
  3.     fields: [  
  4.         {name:'name',  type: 'string'},  
  5.         {name:'age',   type: 'int', convert: null},  
  6.         {name:'phone', type: 'string'},  
  7.         {name:'alive', type: 'boolean', defaultValue: true, convert: null}  
  8.     ],  
  9.     
  10.     changeName:function() {  
  11.         var oldName = this.get('name'),  
  12.             newName = oldName + " The Barbarian";  
  13.     
  14.         this.set('name', newName);  
  15.     }  
  16. });  

通常重复打开定义了Ext.data.Model的页面(就是加载js)会出现一个错误,大致意思是说,重复定义某个类了。

我们可以这样避免这个问题

[java]  view plain  copy
  1. Var exitModel=Ext.ModelManager.get(‘modelId’)//此处modelId是你自己给自己定义的model指定的ID。('User')  
  2. //如果不知道exitModel是什么类型,为什么可以直接取反,请参看js基础(js中 nan,undifined,null,0,‘’都是互通的)  
  3. If(!exitModel){  
  4. //TODO 在这里定义你的model <br>}  

自定义模型之后就可以使用该模型来构造store

改写上面的store

[java]  view plain  copy
  1. Ext.define('ProductModel', {  
  2.      extend:'Ext.data.Model',  
  3.      fields: [{  
  4.                      name : 'primaryKey',  
  5.                      type : 'int'  
  6.                   },{  
  7.                      name : 'price',  
  8.                      type : 'float'  
  9.                   }, {  
  10.                      name : 'productName',  
  11.                      type : 'string'  
  12.                   }, {  
  13.                      name : 'title',  
  14.                      type : 'string'  
  15.                   }, {  
  16.                      name : 'buyDate',  
  17.                      type : 'date',  
  18.                      dateFormat : 'Y-m-d'// 此处可以避免IE下日期出现错误nan  
  19.                   }]  
  20.  });  
  21.     
  22.  var demoStore = Ext.create('Ext.data.Store', {  
  23.      model:'ProductModel',  
  24.      // 数据代理服务  
  25.     proxy : {  
  26.               type : 'ajax',// 使用ajax请求  
  27.                url :'/read/demo/product.action',// 请求后台读取数据的地址  
  28.               // 读取数据的工具(数据代理)  
  29.               reader : {  
  30.                   // 读取方式按照json字符串格式读取  
  31.                   type : 'json',  
  32.                   // json解析成js对象之后读取所有数据(通常是数组)的属性名称。  
  33.                   root : 'root',  
  34.                   // json解析成js对象之后读取数据总条数的属性名称  
  35.                   totalProperty : 'totalProperty'  
  36.               }  
  37.            },  
  38.            // 自动加载  
  39.            autoLoad : true,  
  40.            // 每页显示多少条  
  41.            pageSize : PAGESIZE  
  42.        });  


写上面的store,这样是不是比原来简单多了,而且更清晰了。

其实proxy属性也可以定义在model中。

只是通常不建议这么做。因为模型就是模型,他的数据代理是数据源赋予的。这样也能让我们的程序中,可以定义很多的模型,然后根据需要选择模型来搭配代理,从而为同一个模型赋予不同的后台读取操作。

 

这个组件继承自Ext.data.AbstractStore

 本篇讲解了如何构造并且做一些基本使用

下面是他的属性列表

[java]  view plain  copy
  1. autoLoad //是否自动加载  
  2. autoSync//是否自动同步  
  3. buffered//允许缓冲(官方有个5000条数据的例子可以参看)  
  4. clearOnPageLoad//是否在加载新数据的时候清空旧数据  
  5. clearRemovedOnLoad//加载的时候把删除掉的数据彻底删除(所谓删除掉的数据是指store.remove())  
  6. data//数据  
  7. fields//解析数据的字段  
  8. filters//过滤器(可以参看Ext.util.Filter和Ext.ux.grid.filter.Filter)  
  9. groupDir  
  10. groupField//用哪一个字段分组  
  11. leadingBufferZone//缓冲的情况下,最多缓冲多少行  
  12. listeners//监听器,可以指定各种on事件  
  13. model//解析数据的模型,模型可以代替proxy和fields配置  
  14. pageSize//每页显示多少条数据  
  15. proxy//数据代理(其实就是发送ajax来请求数据用的)  
  16. purgePageCount//多少页清除一次缓存数据(具体是和缓冲结合使用,本文不介绍缓冲)  
  17. remoteFilter//这个属性会往服务器发送过滤条件  
  18. remoteGroup//往服务器发送分组条件(同上,做法就是表单参数提交到后台)  
  19. remoteSort//往后台发送排序条件  
  20. sortOnFilter//排序的时候进行过滤  
  21. storeId//唯一标示,让Ext.data.StoreManager来管理用的  
  22. trailingBufferZone//缓冲多少条  

[java]  view plain  copy
  1. // 本页的全局pageSize  
  2. var PAGESIZE = 20;  
  3.    
  4. var demoStore = Ext.create('Ext.data.Store', {  
  5.            // fields一定要明确指定type,这样有很多好处,比如filter能直接设为true,便会默认按照store-fields设置好的type来确定filter的类型。  
  6.            fields : [{  
  7.                      name : 'primaryKey',  
  8.                      type : 'int'  
  9.                   },{  
  10.                      name : 'price',  
  11.                      type : 'float'  
  12.                   }, {  
  13.                      name : 'productName',  
  14.                      type : 'string'  
  15.                   }, {  
  16.                      name : 'title',  
  17.                      type : 'string'  
  18.                   }, {  
  19.                      name : 'buyDate',  
  20.                      type : 'date',  
  21.                      dateFormat : 'Y-m-d'// 此处可以避免IE下日期出现错误nan  
  22.                   }],  
  23.            // 数据代理服务  
  24.            proxy : {  
  25.               type : 'ajax',// 使用ajax请求  
  26.                url :'/read/demo/product.action',// 请求后台读取数据的地址  
  27.               // 读取数据的工具(数据代理)  
  28.               reader : {  
  29.                   // 读取方式按照json字符串格式读取  
  30.                   type : 'json',  
  31.                   // json解析成js对象之后读取所有数据(通常是数组)的属性名称。  
  32.                   root : 'root',  
  33.                   // json解析成js对象之后读取数据总条数的属性名称  
  34.                   totalProperty : 'totalProperty'  
  35.               }  
  36.            },  
  37.            // 自动加载  
  38.            autoLoad : true,  
  39.            // 每页显示多少条  
  40.            pageSize : PAGESIZE  
  41.        });  
  42.   <pre name="code" class="plain">// 商品grid  
  43.        Var demoGrid = Ext.create('Ext.grid.Panel', {  
  44.                   // 不要边框能好看一些  
  45.                   border : false,  
  46.                   //用来进行选择的选择器  
  47.                   selModel : Ext.create('Ext.selection.CheckboxModel'),  
  48.                   // 所使用的数据源  
  49.                   store : renYuanStore,  
  50.                   // 创建列详细可以参看renYuanColumns函数  
  51.                   columns : renYuanColumns(),  
  52.                   // 需要分页、全显示按钮  
  53.                   pageChange : true,  
  54.                   // 底部toolbar,不需要进行后处理。所以使用“匿名类”  
  55.                   bbar : [{  
  56.                    // 控件类型pagingtoolbar  
  57.                             xtype : 'pagingtoolbar',  
  58.                    // 这个属性好像在extAPI中没写,但是不写还不行。能控制ProgressBarPager。不然ProgressBarPager会出bug  
  59.                             pageSize : PAGESIZE,  
  60.                   // 所使用的数据源  
  61.                             store : renYuanStore,  
  62.                  // 因为Ext.ux.LiveSearchGridPanel默认把tbar和bbar占用了。所以只能使用dockedItems添加toolbar  
  63.                              dock : 'bottom',  
  64.                   // 插件,使用ProgressBarPager插件,显示进度条  
  65.                             plugins : Ext.create('Ext.ux.ProgressBarPager')  
  66.                          }],  
  67.                   // 添加双击编辑事件监听器  
  68.                   listeners : {  
  69.                      itemdblclick : function() {  
  70.                 // editBtn是编辑按钮。此处做法目的是双击数据进行编辑  
  71.                          editBtn.handler();  
  72.                      }  
  73.                   }  
  74.               });  

该组件相当于一个数据源,能够给很多呈现数据的组件提供数据。

核心工作过程是:

首先请求后台读取数据,接受后台返回的数据(其实就是个字符串)

然后按照指定格式解析数据。通常默认格式为json

我们可以自定义解析规则。详细参看Ext.data.reader.Reader

最后把解析好的数据转换成Ext.data.Model实例

我们可以自定义模型。

[java]  view plain  copy
  1. Ext.define('User', {  
  2.     extend:'Ext.data.Model',  
  3.     fields: [  
  4.         {name:'name',  type: 'string'},  
  5.         {name:'age',   type: 'int', convert: null},  
  6.         {name:'phone', type: 'string'},  
  7.         {name:'alive', type: 'boolean', defaultValue: true, convert: null}  
  8.     ],  
  9.     
  10.     changeName:function() {  
  11.         var oldName = this.get('name'),  
  12.             newName = oldName + " The Barbarian";  
  13.     
  14.         this.set('name', newName);  
  15.     }  
  16. });  

通常重复打开定义了Ext.data.Model的页面(就是加载js)会出现一个错误,大致意思是说,重复定义某个类了。

我们可以这样避免这个问题

[java]  view plain  copy
  1. Var exitModel=Ext.ModelManager.get(‘modelId’)//此处modelId是你自己给自己定义的model指定的ID。('User')  
  2. //如果不知道exitModel是什么类型,为什么可以直接取反,请参看js基础(js中 nan,undifined,null,0,‘’都是互通的)  
  3. If(!exitModel){  
  4. //TODO 在这里定义你的model <br>}  

自定义模型之后就可以使用该模型来构造store

改写上面的store

[java]  view plain  copy
  1. Ext.define('ProductModel', {  
  2.      extend:'Ext.data.Model',  
  3.      fields: [{  
  4.                      name : 'primaryKey',  
  5.                      type : 'int'  
  6.                   },{  
  7.                      name : 'price',  
  8.                      type : 'float'  
  9.                   }, {  
  10.                      name : 'productName',  
  11.                      type : 'string'  
  12.                   }, {  
  13.                      name : 'title',  
  14.                      type : 'string'  
  15.                   }, {  
  16.                      name : 'buyDate',  
  17.                      type : 'date',  
  18.                      dateFormat : 'Y-m-d'// 此处可以避免IE下日期出现错误nan  
  19.                   }]  
  20.  });  
  21.     
  22.  var demoStore = Ext.create('Ext.data.Store', {  
  23.      model:'ProductModel',  
  24.      // 数据代理服务  
  25.     proxy : {  
  26.               type : 'ajax',// 使用ajax请求  
  27.                url :'/read/demo/product.action',// 请求后台读取数据的地址  
  28.               // 读取数据的工具(数据代理)  
  29.               reader : {  
  30.                   // 读取方式按照json字符串格式读取  
  31.                   type : 'json',  
  32.                   // json解析成js对象之后读取所有数据(通常是数组)的属性名称。  
  33.                   root : 'root',  
  34.                   // json解析成js对象之后读取数据总条数的属性名称  
  35.                   totalProperty : 'totalProperty'  
  36.               }  
  37.            },  
  38.            // 自动加载  
  39.            autoLoad : true,  
  40.            // 每页显示多少条  
  41.            pageSize : PAGESIZE  
  42.        });  


写上面的store,这样是不是比原来简单多了,而且更清晰了。

其实proxy属性也可以定义在model中。

只是通常不建议这么做。因为模型就是模型,他的数据代理是数据源赋予的。这样也能让我们的程序中,可以定义很多的模型,然后根据需要选择模型来搭配代理,从而为同一个模型赋予不同的后台读取操作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值