You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

修改关联对象后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数据仍是旧值。

修复建议

  1. 优先修正模型定义为Ext.data.Model,确保关联功能能正常触发。
  2. 保存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
    });
    
  3. 检查后端接口:保存B时需同步更新A的关联关系,确保返回的A数据包含最新的bs集合。
  4. 可临时去掉session: true测试,确认是否为Session缓存导致的问题。

内容的提问来源于stack exchange,提问作者Przemek Lewandowski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 08:30:12