複数の数値入力フィールドの値を合計して検証し、Angularのカスタムバリデーターを作成します。
すべての入力は次のようになります。
<input type="number" min="0" max="10">
複数の数値入力があり、全員が0〜10の値を持つことができますが、すべてのフィールドの合計は10以下でなければなりません。
すべての入力フィールドの合計が10以下の場合にtrueを返す関数がありますが、カスタムAngular Validator?.
前述のように、グループ自体のセット検証なので、たとえば次のようにします。
this.myForm = fb.group({
field1: [null],
field2: [null]
// more fields
}, {validator: this.myValidator})
次に、バリデーターでグループ内のformcontrolを繰り返し、合計して、有効かどうかに基づいてエラーまたはnull
を返します。
myValidator(group: FormGroup) {
let sum = 0;
for(let a in group.controls) {
sum += group.get([a]).value;
}
return sum > 10 ? { notValid: true} : null
}
テンプレートでは、次のエラーを表示できます:
*ngIf="myForm.hasError('notValid')"
上記のようにリアクティブフォーム( https://angular.io/guide/reactive-forms )を使用していると仮定すると、次のようにグループにアタッチできるカスタムバリデーターを作成できます。
this.formbuilder.group({...}, { validator: someCustomValidator })
カスタムバリデーターは次のようになります
export const numberMatcher = (control: AbstractControl): {[key: string]: boolean} =>
{
const number = control.get('number');
const number2 = control.get('number2');
return number + number2 < 10 ? null : { exceedsmax: true };
};
コンポーネントにインポートする必要がある(またはコンポーネント内に存在する)
import { numberMatcher } from './numberMatcher';
ngOnInit() {
this.form = this.formbuilder.group({
number: ['', Validators.required],
number2: ['', Validators.required],
{ validator: emailMatcher })
});
}
次に、フォームを通常どおり設定し、formControlNameがバリデーターでチェックされている名前と一致することを確認します。その後、通常どおりエラーをチェックできます。
<div class="error" *ngIf="user.get('form').touched && user.get('form').hasError('exceededmax')">
All fields must equal less than 10
</div>
例えば。本質的にこれで問題が解決すると思いますが、ここで書いた非常に単純なアウトラインコードからの調整と調整が必要になります。
FormGroup
を使用している場合
this.myForm = new FormGroup({
field1: new FormControl(null, Validators.required),
field2: new FormControl(null, Validators.required),
}, someCustomValidator);