gpt4 book ai didi

Angular - FormArray 中的唯一性验证器

转载 作者:太空狗 更新时间:2023-10-29 17:17:20 28 4
gpt4 key购买 nike

我创建了一个自定义验证器来验证我的 FormArray 中的唯一性。当特定的值已经在数组中时,我想显示错误。

问题是它没有按预期工作。

实际行为:

重现步骤:

  • 添加 3 个“输入”- 地址;
  • 填写输入1;
  • 用不同的值填充输入2;
  • 用与输入1相同的值填充输入3; (没有错误出现,无论是在输入 1 还是在输入 3)

预期行为:

如果相同的值出现在“X 组”中,则它们的特定输入必须显示错误。

在上述情况下,错误应该出现在输入 1 和 3 上。

假设我有 4 个输入:

  1. 值:堆栈
  2. 值:溢出
  3. 值:堆栈
  4. 值:溢出

4 个输入必须显示错误,因为它们都是重复的。


static uniqueBy = (field: string, caseSensitive = true): ValidatorFn => {
return (formArray: FormArray): { [key: string]: boolean } => {
const controls = formArray.controls.filter(formGroup => {
return isPresent(formGroup.get(field).value);
});
const uniqueObj = { uniqueBy: true };
let found = false;

if (controls.length > 1) {
for (let i = 0; i < controls.length; i++) {
const formGroup = controls[i];
const mainControl = formGroup.get(field);
const val = mainControl.value;
const mainValue = caseSensitive ? val.toLowerCase() : val;

controls.forEach((group, index) => {
if (i === index) {
// Same group
return;
}

const currControl = group.get(field);
const tempValue = currControl.value;
const currValue = caseSensitive ? tempValue.toLowerCase() : tempValue;
let newErrors;

if ( mainValue === currValue) {
if (isBlank(currControl.errors)) {
newErrors = uniqueObj;
} else {
newErrors = Object.assign(currControl.errors, uniqueObj);
}

found = true;
} else {
newErrors = currControl.errors;

if (isPresent(newErrors)) {
// delete uniqueBy error
delete newErrors['uniqueBy'];

if (isBlank(newErrors)) {
// {} to undefined/null
newErrors = null;
}
}
}

// Add specific errors based on condition
currControl.setErrors(newErrors);
});
}

if (found) {
// Set errors to whole formArray
return uniqueObj;
}
}

// Clean errors
return null;
};
}

你可以在这里查看 DEMO .

最佳答案

在您的代码中使用嵌套 for 循环,您会在其中交错错误。

以下是每次迭代的验证状态的查找方式:

  0      [null, "{"uniqueBy":true}", null]

1 ["{"uniqueBy":true}", "{"uniqueBy":true}", null]

2 [null, "{}", null]

http://plnkr.co/edit/MTjzQ9KiJHJ56DVAZ155?p=preview (添加三个地址,观察输出)

在下面的代码中,我只在 for 循环语句之前清除了一次错误并且不再删除错误。

controls.map(formGroup => formGroup.get(field)).forEach(x => x.errors && delete x.errors['uniqueBy']);
for (let i: number = 0; i < controls.length; i++) {
const formGroup: FormGroup = controls[i] as FormGroup;
const mainControl: AbstractControl = formGroup.get(field);
const val: string = mainControl.value;

const mainValue: string = caseSensitive ? val.toLowerCase() : val;
controls.forEach((group: FormGroup, index: number) => {
if (i === index) {
return;
}

const currControl: any = group.get(field);
const tempValue: string = currControl.value;
const currValue: string = caseSensitive ? tempValue.toLowerCase() : tempValue;
let newErrors: any;

if ( mainValue === currValue) {
if (isBlank(currControl.errors)) {
newErrors = uniqueObj;
} else {
newErrors = Object.assign(currControl.errors, uniqueObj);
}
currControl.setErrors(newErrors);
find = true;
}
});
}

Plunker Example

关于Angular - FormArray 中的唯一性验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43577894/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com