理解Ext.data.JsonStore 对象

本文介绍了Ext JS中JsonStore和JsonReader的使用方法,包括数据加载、解析配置及常见属性说明,帮助开发者理解如何组织和读取JSON数据。

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

Ext.data.JsonStore 对象  


先来看看这个对象是干嘛的:

Json:JS的数据格式
Store:名词是商店,商店里可以摆放货物(数据).动词是储藏,商店里的货物都是按一定规律排放的,自然我们的数据也要按一定的规律排放.
JsonStore:通俗讲就是Json格式数据的一个商店了.里面不仅有数据,而且还可以定义数据的存放规则,还有店员(方法),你可以用方法获取数据,以及把这些数据删除\更新\添加等…


Ext.data.JsonReader 对象


那我们先来说说怎么摆放数据,不然货物进来了乱堆可不行.这就要说到Ext.data.JsonReader 这个对象了.
因为 Ext.data.JsonStore 已经包含了 Ext.data.JsonReader 所以我们在新建一个 Ext.data.JsonStore 实例的时候,并不需要再建个 Ext.data.JsonReader 出来.
这里把 Ext.data.JsonReader 的几个常用属性列出来.其它的可以去参考它的API: JsonReader .
我们要先拿到货了,才能判断这个货是摆在哪里对吧,所以先拿货物清单出来瞧瞧:


{   
    results: 2000,   
    rows: [   
    { id: 1, firstname: 'Bill', occupation: 'Gardener' },   
        { id: 2, firstname: 'Ben' , occupation: 'Horticulturalist' },   
        ...   
    ]   
}  
{
    results: 2000,
    rows: [
    { id: 1, firstname: 'Bill', occupation: 'Gardener' },
     { id: 2, firstname: 'Ben' , occupation: 'Horticulturalist' },
     ...
    ]
}


这清单上有2个属性,results 说明这个货物有2000件,rows 是个数组,自然是2000条了,里面的单条信息就是我们要的具体货物信息了.单件货物有3个属性 id, firstname 和 occupation (天,这些’货物’好像是人) .
(注意这个清单里的属性是我们写的.所以也可以是别的,如:你可以把 results 写成totalCount 或者把 rows 写成 data,或者把 occupation 写成 other,当然 id 这个属性有点特殊,但也没死规定不能换成别的,哈哈 )
好了,我们有清单了,但我们要把这个清单录进电脑,让其他人也能看到,可是我们能一个个输这些也太麻烦了.所以我们能要告诉电脑怎么读这个清单.


首先是totalProperty : ‘results’就是确定货物的总件数了.
其次是root :’rows’ 告诉电脑我们的清单是哪个数组
现在我们来设置 fields 来读取这个数组:


"fields": [   
    {"name": "name"},   
    {"name": "job", "mapping": "occupation"}   
]  
"fields": [
 {"name": "name"},
 {"name": "job", "mapping": "occupation"}
]


{"name": "job", "mapping": "occupation"} 告诉电脑把occupation 属性转为 job.
{"name": "name"} 告诉电脑把 id 转成 name. 为什么是id呢,这边又涉及的JsonReader 对象里的一个属性idProperty(默认值是’id’) ,他告诉电脑,id 是默认的属性.你也可以把其它的设成默认属性,如idProperty: ‘firstname’,这样当我们{"name": "name"} 的时候,就是告诉电脑把firstname’转成name 了.
Fields 现在看来是个数组.那什么时候才是个对象呢,就是当rows里的单条记录只有1个属性的时候了.




Ext.data.JsonStore 对象加载数据 
好了.我们已经告诉机器怎么读清单了,但现在有个问题,我们要去哪里读这个清单.这里就开始用到JsonStore 自己的属性了.


url : 数据清单的地址,这个地址输出的结果就是上面已经写了的那个 2000数据的清单.这里会用AJAX调用.
autoLoad :是否在JsonStore对象创建后自动打开 url并加载数据.不写这个属性默认是不会自动加载,等同于写autoLoad:false
autoLoad 可以是布尔,也可以是一个对象,当是对象的时候,这个对象就会在加载的时候传递到JsonStore的load 方法里.这个对象可以参考API中的 load 方法, 有一些特定的属性.当我们把autoLoad 设为false 或者不设置该值时,我们就需要在后续的代码中手动调用 load() 方法才能打开url并加载数据了.


JsonStore 还有其它的配置参数以及方法 ,如:如何得到单条数据,如何添加新数据\删除\更新等.. 详见API: JsonStore


load方法. 
load(Object options) : Boolean 默认是返回true,但当我们在监听beforeload 事件时,定义的句柄返回 false,则load 停止(也就是不打开url加载数据了)并返回false.
options:load时定义的参数,这个就是autoLoad那要传的一样了.
params 打开url后附带传递的参数对象,如:{id:’1234’}
callback 函数,当数据加载完成后调用的函数,有3个参数如:


r : Ext.data.Record[] 记录集数组. 
options : 发送给服务器的对象{params:{id:’1234’}} 
success : 是否成功,布尔. 
scope 定义callback的作用域 
add 是添加到现有数据后,还是替换现有数据.默认是替换 false:替换现有数据
<think>好的,我现在需要解决用户在Ext.data.JsonStore中遇到的data不生效的问题。首先,我应该回忆一下Ext JS框架中JsonStore的使用方法,以及常见的配置错误。 用户提到data不生效,可能的原因有很多。首先,我需要确认用户是否正确配置了JsonStore的字段(fields)和数据结构。JsonStore依赖于正确的数据格式,特别是当使用远程数据时,需要totalProperty和root属性来正确解析响应数据。根据引用[2],totalProperty用于指定JSON响应中总结果数的位置,而root指定了数据数组的路径。如果这些配置不正确,数据可能无法正确加载到Store中。 接下来,用户可能在本地数据的情况下,没有正确设置data属性。例如,是否将数据直接赋给了Store的data属性,或者是否在定义Store时通过data配置项传递了数据。此外,数据格式是否正确也是一个关键点,比如是否是一个对象数组,每个对象的字段是否与定义的Model匹配。 另外,引用[1]中提到了一种将Store数据复制到隐藏表单字段的方法,这可能涉及到Store的事件监听,比如在数据加载或更新时触发某些操作。如果用户没有正确监听Store的load事件,可能会导致数据未被正确处理。例如,可能在数据尚未加载完成时就尝试访问它,导致数据不可用。 还需要考虑Store是否被正确绑定到组件,比如Grid或ComboBox。如果Store没有与视图组件正确关联,即使数据加载成功,用户界面也不会显示数据。此时需要检查视图组件的store配置是否指向正确的Store实例。 另一个可能性是数据加载的时机问题。如果用户使用的是异步加载,可能在数据加载完成前就进行了其他操作,导致数据未就绪。这时需要确保在加载数据后执行相关操作,可以通过监听Store的load事件来实现。 此外,检查浏览器控制台是否有JavaScript错误也是必要的步骤。可能存在的语法错误或配置错误会导致整个Store初始化失败,进而数据无法加载。 总结可能的原因: 1. 数据格式不正确,未符合JsonStore的配置(如root、totalProperty不正确)。 2. 字段定义(fields)与数据中的键不匹配。 3. Store未正确加载或绑定到组件。 4. 异步加载数据时未正确处理加载完成事件。 5. 存在JavaScript错误导致Store无法初始化。 接下来,我需要为用户提供一个结构清晰的解决方案,分步骤检查并解决这些问题。确保用户能逐步验证配置是否正确,包括检查数据格式、配置项、事件监听等。同时,结合引用中的例子,比如正确配置totalProperty和root,或者确保数据通过正确的方式传递到Store中。</think>### Ext.data.JsonStoredata不生效的解决方案 #### 1. 检查数据格式与配置 Ext.data.JsonStore需要严格遵循以下配置规范: - **数据格式**:JSON数据必须包含`root`属性指定的键值对,例如: ```javascript { total: 100, // 对应totalProperty配置 items: [{id:1, name:"test"}] // 对应root配置 } ``` - **Store配置**:需正确定义`fields`、`root`和`totalProperty`: ```javascript var store = new Ext.data.JsonStore({ fields: ['id', 'name'], root: 'items', // JSON中数据数组的键 totalProperty: 'total', // JSON中总记录数的键 proxy: new Ext.data.HttpProxy({ url: 'data.json' }) }); ``` 若使用本地数据,直接通过`data`属性传递: ```javascript var store = new Ext.data.JsonStore({ fields: ['id', 'name'], data: {items: [{id:1, name:"test"}]} // 需包含root对应的键 }); ``` #### 2. 确保数据加载完成后再操作 - **异步加载**时需监听`load`事件: ```javascript store.load({ callback: function(records, options, success) { if (success) { console.log('数据加载成功:', records); } } }); ``` - **同步加载**(不推荐)可设置`async: false`,但可能阻塞界面。 #### 3. 验证数据绑定 若数据已加载但未显示,检查视图组件(如Grid)的配置: ```javascript var grid = new Ext.grid.GridPanel({ store: store, // 确保此处指向正确的Store实例 columns: [{header: 'ID', dataIndex: 'id'}, {header: '名称', dataIndex: 'name'}] }); ``` #### 4. 调试与日志输出 - 在浏览器控制台检查Store状态: ```javascript console.log('Store数据:', store.getRange()); // 输出所有记录 console.log('总记录数:', store.getTotalCount()); // 检查totalProperty是否生效 ``` - 若返回空,可能是数据未正确解析或未触发加载。 #### 5. 常见错误排查 - **字段不匹配**:确保`fields`定义的字段名与JSON数据中的键完全一致(区分大小写)。 - **缺失代理配置**:远程数据需配置`proxy`,本地数据需直接赋值`data`。 - **JSON格式错误**:使用在线工具(如JSONLint)验证JSON合法性。 #### 6. 参考代码模板 完整示例如下: ```javascript // 定义Store var store = new Ext.data.JsonStore({ fields: ['id', 'name'], root: 'items', totalProperty: 'total', proxy: new Ext.data.HttpProxy({ url: 'data.json' }), autoLoad: true // 自动加载数据 }); // 绑定到Grid var grid = new Ext.grid.GridPanel({ store: store, columns: [{header: 'ID', dataIndex: 'id'}, {header: '名称', dataIndex: 'name'}], renderTo: Ext.getBody() }); // 手动加载数据(可选) store.load({ callback: function() { console.log('当前数据:', store.getRange()); } }); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值