# 通过校验实现子表格不允许重复录入
# 1.场景介绍
供应商父表单中的物料子表单添加数据时,物料名称字段的数据不允许重复。
本文以上述场景,讲解如何实现子表单内数据的重复校验。
# 2.效果预览
# 3.实现思路
在子表单中对物料名称字段所在的组件添加自定义校验事件,从父表单中获取子表单的数据并遍历判断是否有重复数据,如果重复直接返回提示字样,未重复返回null。
# 4.操作步骤
# 4.1创建表单
初始化数据库,以MySQL为例,脚本如下:
create table material_info (
ID varchar(255) not null comment '主键',
name varchar(255) comment '物料名称',
type varchar(255) comment '物料类型',
space varchar(255) comment '规格',
prices varchar(255) comment '价格',
supplier_id varchar(255),
primary key (ID)
);
create table supplier_info (
id varchar(255) not null,
supplier_id varchar(255) comment '供应商编码',
supplier_name varchar(255) comment '供应商名称',
usci varchar(255) comment '统一社会信用代码',
status varchar(255) comment '供应商审核状态',
primary key (id)
);
创建数据实体,拖拽material_info表和supplier_info表,并添加关联关系。
右键供应商实体生成表单,此时会自动生成物料子表单。
# 4.1自定义校验事件
在物料子表单中,点击供应商名称字段所在的组件,校验-自定义校验事件,添加校验逻辑。
//判断父表单和子表单是否有数据
if (this.parentFormData && this.parentFormData.MaterialInfos) {
//设置标志
let firstMatchFound = false;
//遍历物料对象数组
for (const item of this.parentFormData.MaterialInfos) {
//如果输入的值与遍历的值相等
if (item.name === value) {
//此时遍历的值与输入的值为同一个,需要跳过第一个匹配项
if (firstMatchFound) {
// 如果已经找到过匹配项,再次找到则视为重复
return "数据重复!";
} else {
// 如果是第一个匹配项,设置标志并继续遍历
firstMatchFound = true;
}
}
}
return null; // 如果没有找到任何后续匹配项,返回 null
} else {
return null; // 如果 MaterialInfos不存在或 parentFormData为空,也返回 null
}
实现效果: