我創建了一個自定義驗證程序來驗證我的FormArray
中的唯一性。當特定值已經在數組中時,我想顯示錯誤。FormArray中的角度 - 唯一性驗證程序
問題是它沒有按預期工作。
實際行爲:
重現步驟:
- 添加3 「投入」 - 地址;
- 填入輸入1;
- 用不同的值填充輸入2;
- 用輸入1的相同值填充輸入3; (出現任何錯誤,無論是在輸入1,也不在輸入3)
預期行爲:
如果相同的值出現在「X基團」,其具體的輸入必須顯示錯誤。
在錯誤上述應該出現在輸入1和3
假設我有4個輸入的情況下:
- 值:堆
- 值:溢出
- 值:堆棧
- value:溢出
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](https://github.com/angular-ui/ui-validate)庫 –
嘗試類似此方法http://plnkr.co/edit/legvjz4vVQDIotr633KX?p=preview – yurzui
@yurzui感謝您的演示。它看起來很完美。你可以將它添加爲答案,以便我可以檢查它嗎?另外,如果你不介意的話,你可以提供一些解釋,說明你做了什麼。 –