Supposons que notre formulaire ait des champs de date startDate et endDate et nous voulons nous assurer que startDate doit être avant endDate.
Pour implémenter des validations contenant un ou plusieurs contrôles frères, nous devons définir la fonction de validation à un niveau supérieur à celui des contrôles frères.
ngOnInit() : void
{
this.formGroup = this.formBuilder.group(
{
startDate : new FormControl({
value : null,
disabled : false
}, [ Validators.required ]),
endDate : new FormControl({
value : null,
disabled : false
}, [ Validators.required ]),
},
// NOTE Validateur de haut niveau
{ validator : DateValidator.dateRangeValidator });
}Ensuite, nous définissons un validateur personnalisé dans un fichier séparé, par exemple date.validator.ts.
// Angular modules
import { Injectable } from '@angular/core';
import { AbstractControl } from '@angular/forms';
import { ValidationErrors } from '@angular/forms';
@Injectable({
providedIn : 'root'
})
export class DateValidator
{
constructor() {}
public static dateRangeValidator(control : AbstractControl) : ValidationErrors | null
{
// NOTE Contrôle de sécurité
if (!control.get('startDate').value || !control.get('endDate').value)
return null;
// NOTE Comparaison de champs
// const mStart = moment(control.get('startDate').value);
// const mEnd = moment(control.get('endDate').value);
// const isValid = mStart.isBefore(mEnd);
// NOTE Invalide
if (!isValid)
return { invalidDateRange : true };
// NOTE Valide
return null;
}
}Si invalide, retourne un objet d'erreur (n'importe quel nom arbitraire), comme, return { invalidEndDate: true }.
Assurez-vous qu'il renvoie toujours un null pour les cas valides ou non pertinents, et un objet "non-null" dans les cas où une erreur doit être déclenchée sur le formGroup.
Pour afficher l'erreur au niveau de notre vue, nous utilisons la clé invalidDateRange retournée par notre validateur.
<div *ngIf="formGroup.hasError('invalidDateRange')">
La date de début n'est pas antérieure à la date de fin
</div>