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

ExtJs 7.5.0.55中TypeError读取null的value属性报错排查

ExtJS 7.5.0.55: TypeError: Cannot read properties of null (reading 'value') 解决方案

问题背景

在ExtJS 7.5.0.55环境下,删除Grid Store中的记录后,Ext.grid.CellEditor关联的Ext.form.field.Text组件实例仍存在,但对应的DOM节点已从DOM树中移除。后续触发组件的getValue方法时,因访问this.dom.value抛出TypeError: Cannot read properties of null (reading 'value')错误,且仅隐藏CellEditor无法解决问题。

解决方案

1. 重写Text组件的getValue方法,增加DOM存在性检查

直接在报错源头添加防御性判断,避免访问不存在的DOM节点:

Ext.define('MyApp.overrides.form.field.Text', {
    override: 'Ext.form.field.Text',
    
    getValue: function(asNumber) {
        if (!this.dom) {
            return asNumber ? 0 : ''; // 返回对应类型的默认值
        }
        return this.callParent(arguments);
    }
});

2. 删除记录前主动销毁激活的CellEditor

从根源上避免组件实例与DOM分离的情况,删除记录前先销毁当前激活的CellEditor:

// 获取Grid和CellEditing插件
var grid = Ext.getCmp('yourGridComponentId');
var cellEditingPlugin = grid.getPlugin('cellediting');

// 检查是否有激活的编辑器并销毁
if (cellEditingPlugin && cellEditingPlugin.getActiveEditor()) {
    cellEditingPlugin.getActiveEditor().destroy();
}

// 执行记录删除操作
grid.getStore().remove(targetRecord);

3. 拦截checkChange事件,阻止DOM不存在时的执行

错误堆栈显示报错由checkChange方法触发,重写该方法添加DOM检查:

Ext.define('MyApp.overrides.form.field.Text', {
    override: 'Ext.form.field.Text',
    
    checkChange: function() {
        if (!this.dom) {
            return;
        }
        this.callParent(arguments);
    }
});

说明

  • 方案1和3属于全局补丁,适合快速解决问题;
  • 方案2从业务流程上避免问题发生,更符合ExtJS组件生命周期规范。

内容的提问来源于stack exchange,提问作者Sergey Timushkin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:25:07