【发布时间】:2017-09-20 12:47:47
【问题描述】:
我创建了一个自定义验证器来验证我的FormArray 中的唯一性。当特定值已经在数组中时,我想显示错误。
问题是它没有按预期工作。
实际行为:
重现步骤:
- 添加 3 个“输入” - 地址;
- 填写输入1;
- 用不同的值填充输入 2;
- 用与输入 1 相同的值填充输入 3; (输入 1 和输入 3 均未出现错误)
预期行为:
如果相同的值出现在“X 组”中,则它们的特定输入必须显示错误。
在上述情况下,错误应该出现在输入 1 和 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。
【问题讨论】:
-
你可以试试ui-validate library
-
@yurzui 感谢您的演示。似乎它工作得很好。您可以将其添加为答案以便我检查吗?此外,如果您不介意,您可以提供一些解释,说明您为使其工作所做的工作。