FormArray
の一意性を検証するカスタムバリデータを作成しました。特定の値がすでに配列されているときにエラーを表示したい。角 - FormArrayの一意性バリデータ
問題は期待どおりに機能していないことです。
実際の動作は:
再現手順:
- は3 "入力" 追加 - アドレス。
- フィル入力1;
- 入力値2を異なる値で入力します。
- 入力1に同じ値を入力3に入力します。 (表示され、どちらの入力1でも、入力3にエラー)
期待される動作:同じ値が「Xグループ」に表示された場合は、その特定の入力がエラーを
を示してはなりません。私は4つの入力を有していると仮定すると、入力1および3
に表示されたエラー上述場合
:
- 値:スタック
- 値:オーバーフロー
- 値:スタック
- 値:オーバーフロー
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デモをありがとう。それは完全に動作しているようです。私はそれを確認することができるように答えとして追加することはできますか?また、あなたが気にしないなら、それを働かせるために何をしたのかについて何らかの説明をすることができます。 –