Je souhaite valider plusieurs champs de saisie de nombres en résumant leurs valeurs et créer un validateur personnalisé pour Angular.
Chaque entrée ressemble à ceci:
<input type="number" min="0" max="10">
Il existe plusieurs entrées numériques et tout le monde peut avoir une valeur comprise entre 0 et 10, mais la somme de tous les champs doit être inférieure ou égale à 10.
J'ai une fonction qui renvoie vrai si la somme de tous les champs de saisie est inférieure ou égale à 10. Mais comment y parvenir avec un validateur personnalisé Angular? Pour que le message d'erreur apparaisse instantanément.
Comme mentionné, la validation d'ensemble sur le groupe lui-même, par exemple:
this.myForm = fb.group({
field1: [null],
field2: [null]
// more fields
}, {validator: this.myValidator})
Ensuite, dans votre validateur, parcourez les contrôles de formulaire de votre groupe, récapitulez et renvoyez l'erreur ou la variable null
en fonction de la valeur valide ou non:
myValidator(group: FormGroup) {
let sum = 0;
for(let a in group.controls) {
sum += group.get([a]).value;
}
return sum > 10 ? { notValid: true} : null
}
et dans le modèle, vous pouvez afficher une erreur avec:
*ngIf="myForm.hasError('notValid')"
En supposant que vous utilisez des formulaires réactifs ( https://angular.io/guide/reactive-forms ) comme mentionné ci-dessus, vous pouvez créer un validateur personnalisé pouvant être attaché au groupe, de la manière suivante:
this.formbuilder.group({...}, { validator: someCustomValidator })
Le validateur personnalisé ressemblerait à quelque chose comme ça
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 };
};
Ce qui doit être importé dans votre composant (ou existe à l'intérieur de celui-ci)
import { numberMatcher } from './numberMatcher';
ngOnInit() {
this.form = this.formbuilder.group({
number: ['', Validators.required],
number2: ['', Validators.required],
{ validator: emailMatcher })
});
}
Ensuite, configurez votre formulaire normalement, en vous assurant que le nom formControlName correspond au nom en cours de vérification dans le validateur. Vous pouvez alors vérifier normalement l’erreur c’est-à-dire.
<div class="error" *ngIf="user.get('form').touched && user.get('form').hasError('exceededmax')">
All fields must equal less than 10
</div>
par exemple. Je pense que, pour l’essentiel, cela résoudra votre problème, mais il faudra quelques ajustements et ajustements à partir du code très simple que j’ai écrit ici.
Si vous utilisez FormGroup
this.myForm = new FormGroup({
field1: new FormControl(null, Validators.required),
field2: new FormControl(null, Validators.required),
}, someCustomValidator);