修改关联对象后ExtJS Store未更新或更新异常求助
ExtJS关联更新异常问题分析
核心错误修正:模型定义混淆
你当前把A和B错误定义为Ext.data.Store(数据存储类),但关联功能是基于**Ext.data.Model(数据模型类)**实现的,这是导致后续问题的根本前提错误,正确的模型定义应为:
Ext.define('A', { extend: 'Ext.data.Model', // 修正为Model fields: [ { name: 'id', type: 'string' }, { name: 'title', type: 'string' }, ] }); Ext.define('B', { extend: 'Ext.data.Model', // 修正为Model fields: [ { name: 'id', type: 'string' }, { name: 'name', type: 'string' }, { name: 'a', reference: { type: 'A', inverse: 'bs', }, }, ] });
针对你的问题:调用as.load()是否应更新A的bs字段?
理论上,重新加载as Store会从服务器拉取最新的A数据(包括关联的bs集合),应该能同步显示。但你遇到的「B未从原A中移除」异常,主要由以下原因导致:
- Session缓存干扰:配置
session: true后,Session会缓存模型实例,若服务器返回的A数据未明确更新bs关联,Session不会自动同步关联关系的变化。 - 双向关联未自动同步:修改
currentB.a并保存时,前端本应自动更新原A的bs集合,但因模型定义错误,或后端未正确处理反向关联更新,导致同步失效。 - 异步操作时机问题:
currentB.save()是异步操作,若提前调用as.load(),后端可能还未完成B的关联更新,拉取的A数据仍是旧值。
修复建议
- 优先修正模型定义为
Ext.data.Model,确保关联功能能正常触发。 - 保存B后,手动同步关联关系,而非直接重载整个Store:
currentB.save({ success: function(record) { // 移除原A的关联 var oldA = record.previous('a'); oldA && oldA.bs().remove(record); // 添加新A的关联 var newA = record.get('a'); newA && newA.bs().add(record); // 如需和服务器强一致,再重载Store this.getViewModel().getStore('as').load(); }, scope: this }); - 检查后端接口:保存B时需同步更新A的关联关系,确保返回的A数据包含最新的
bs集合。 - 可临时去掉
session: true测试,确认是否为Session缓存导致的问题。
内容的提问来源于stack exchange,提问作者Przemek Lewandowski
相关产品推荐
相关产品推荐

