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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:00:14