Je travaille avec des formulaires réactifs en angulaire, j'ai besoin de comparer la date de début "date de début" avec la date de fin "date de fin", les deux contrôles sont validés dans la fonction "dateLessThan", mais le problème est que je ne sais pas comment demander le contrôle évalue
//Some stuff
public fechaInicio = new FormControl('', [
Validators.required
, this.dateLessThanTo
]);
public fechaFin = new FormControl('', [
Validators.required
, this.dateLessThan
]);
createForm() {
this.contratoForm = this.formBuilder.group({
fechas: this.formBuilder.group({
fechaInicio: this.fechaInicio,
fechaFin: this.fechaFin
}, { validator: this.dateLessThan('fechaInicio', 'fechaFin') }),
});
}
Ici, j'ai besoin de connaître le nom du contrôle pour comparer les dates:
dateLessThanTo(fieldControl: FormControl) {
//
//if (fechaInicio.value > FechaFin.value){
// return true;
//}
//else{
// return false;
// }
}
//Some stuff
Dans votre validateur personnalisé, vous obtenez le formGroup
fechas
, vous n'avez donc pas besoin de passer de paramètres à partir du code TS:
createForm() {
this.contratoForm = this.formBuilder.group({
fechas: this.formBuilder.group({
fechaInicio: this.fechaInicio,
fechaFin: this.fechaFin
}, { validator: this.dateLessThanTo }),
});
}
et dans votre validateur personnalisé:
dateLessThanTo(group: FormGroup) {
if (group.controls.fechaInicio.value > group.controls.fechaFin.value){
return {notValid: true}
}
return null;
}
Vous devez renvoyer null
lorsqu'elle est valide et définir une erreur, par exemple notValid
lorsqu'elle ne l'est pas.
Obtenez le groupe parent du contrôle, puis comparez-le au contrôle actuel:
dateLessThanTo(control: AbstractControl) {
let name = this.getName(control);
...
}
private getName(control: AbstractControl): string | null {
let group = <FormGroup>control.parent;
if (!group) {
return null;
}
let name: string;
Object.keys(group.controls).forEach(key => {
let childControl = group.get(key);
if (childControl !== control) {
return;
}
name = key;
});
return name;
}
Vous pouvez le faire avec:
Object.getOwnPropertyNames(this.contratoForm['controls']['fechas']['controls']).map((key: string) => {
// Something like this. Not sure how your form looks like
dans votre composant, vous pouvez ajouter un validateur personnalisé comme celui-ci
static customValidator(control: AbstractControl): { [key: string]: any } {
const controlName = (Object.keys(control.parent.controls).find(key => control.parent.controls[key] === control));
if (control.value === 0) {
return {key: {error: 'invalid'}};
}
return null; }
dans controlName, vous aurez le nom de votre contrôle.
vous avez juste à faire comme ça, vous pouvez inspecter un FormControl
individuel dans un formulaire en l'extrayant avec la méthode .get ().
contratoForm.get('fechaInicio').value
dateLessThanTo(fieldControl: FormControl) {
let va= fieldControl.get('fechaInicio').value ;
let va1 = fieldControl.get('FechaFin').value ;
}
vérifiez ici: https://angular.io/guide/reactive-forms#inspect-formcontrol-properties