FieldPanel isDirty()方法异常求助:未修改字段却返回true
Ext JS FieldPanel
isDirty() Returns True Unexpectedly After resetOriginalValue() on Unmodified ComboBox 问题场景
- 未修改FieldPanel中任何字段的前提下,对所有字段调用
resetOriginalValue()后,isDirty()始终返回true - 仅ComboBox会引发该异常:
- 跳过对ComboBox调用
resetOriginalValue()时,isDirty()判断正常 - 修改ComboBox选项后再执行
resetOriginalValue(),功能恢复正常 - 只有当ComboBox从未被修改过就执行
resetOriginalValue(),才会触发isDirty()误判
- 跳过对ComboBox调用
- 其他字段类型(如文本框、复选框等)无此问题
解决方案
可以通过重写ComboBox的resetOriginalValue()方法,修复未修改状态下的脏值标记问题:
Ext.define('FixComboBoxResetOverride', { override: 'Ext.form.field.ComboBox', resetOriginalValue: function() { // 仅当字段确实被修改过,才执行父类逻辑 if (this.isDirty()) { this.callParent(arguments); } else { // 手动同步原始值与当前值,确保脏值检查准确 this.originalValue = this.getValue(); this.checkDirty(); } } });
如果不想全局重写,也可以在调用resetOriginalValue()时增加判断逻辑:
// 遍历FieldPanel内所有字段 yourFieldPanel.items.each(function(field) { if (field.isDirty()) { field.resetOriginalValue(); } else { // 未修改的字段直接同步原始值,避免误触发脏值状态 field.originalValue = field.getValue(); field.checkDirty(); } });
问题原因
ComboBox的原生resetOriginalValue()方法在处理未修改字段时,会错误地改变内部的原始值对比状态,导致isDirty()方法误判字段已被修改。而其他字段类型的resetOriginalValue()实现逻辑会跳过未修改字段的状态变更,因此不会出现该问题。
内容的提问来源于stack exchange,提问作者Tejas Patadiya
相关产品推荐
相关产品推荐

