DevExpress Angular Grid自定义验证回调重复值校验误判问题求助
解决DevExpress Grid编辑单元格时重复值验证误判问题
问题根源
你当前的实现中,abbreviation_array通过验证通过后手动push值维护,会导致数组数据和Grid数据源不同步——编辑已有单元格时,目标值早已存在于数组中,触发不必要的重复判断,同时手动维护数组也容易引发数据不一致问题。
解决方案
直接从Grid数据源中获取所有已存在的Abbreviation值,验证时排除当前编辑行的原始值,以此区分新增行和编辑已有行的场景:
- 放弃手动维护
abbreviation_array,直接从数据源读取最新值 - 获取当前编辑行的原始
Abbreviation值,验证时跳过该值的比对 - 简化逻辑,直接判断当前输入值是否与其他行的值重复
修改后的代码示例
TS文件代码
validationCallback(e: any) { // 空值处理(可根据业务需求调整是否允许空值) if (!e.value) { this.abbrev_flag = false; return true; } // 从Grid数据源中获取所有已存在的Abbreviation值 const existingAbbreviations = this.dataSource .map(item => item.Abbreviation) .filter(val => val !== undefined && val !== null); // 获取当前编辑行的原始Abbreviation值 const originalValue = e.data?.Abbreviation; // 判断是否为重复值:当前值存在于现有列表中,且不是当前行的原始值 const isDuplicate = existingAbbreviations.some(val => val === e.value && val !== originalValue); this.abbrev_flag = isDuplicate; return !isDuplicate; }
HTML文件代码
建议将reevaluate设为true,确保编辑时能重新触发验证逻辑:
<dxi-column dataField="Abbreviation"> <dxi-validation-rule type="custom" [reevaluate]="true" [validationCallback]="validationCallback"> </dxi-validation-rule> </dxi-column>
逻辑说明
- 新增行场景:
e.data?.Abbreviation为undefined,此时会检查所有现有行的Abbreviation是否与输入值重复 - 编辑已有行场景:若输入值与当前行原始值一致,会跳过比对,不会判定为重复;若修改为其他行已存在的值,则会触发重复验证
- 直接从数据源取值,确保验证逻辑基于最新的Grid数据,避免手动维护数组导致的不同步问题
内容的提问来源于stack exchange,提问作者Jyoti Sinha
相关产品推荐
相关产品推荐

