J'ai une forme angulaire réactive dans laquelle je veux valider la date d'admission de telle sorte que sa date minimale soit Date de naissance, comment puis-je la valider en fonction du champ
composant ts:
<div> <div class="container"> <main class="col-12"><h3 class="bd-title" id="content">Cross Field Validation Date</h3> <br> <form [formGroup]="userForm"> <div class="form-group"> <label>Birth Date</label> <input type="text" formControlName="birthDate" class="form-control" /> </div> <app-plan-admission-date [admissionDateControl]="userForm.controls.admissionDate"></app-plan-admission-date> <button [disabled]="!userForm.valid" class="btn btn-primary">Submit</button> </form></main> </div> </div>
Html:
ngOnInit(){ this.userForm = this.formBuilder.group({ 'birthDate':[''], 'admissionDate': [''] }); } } @Component({ selector: 'app-plan-admission-date', template: <div class="form-group"> <label>Admission Date</label> <input type="text" [formControl]="admissionDateControl" class="form-control" /> </div> }) export class AdmissionDateComponent { @Input() admissionDateControl:AbstractControl; }
Est-il possible de valider la date
en utilisant un champ croisé sans faire de validation personnalisée dans angulaire
Stackblitz: https: //stackblitz.com/edit/cross-field-date-validation-in-angular
4 Réponses :
Vous avez raison, vous pouvez le faire via un validateur personnalisé, cela devrait ressembler à ceci (validation des dates mise à part):
export function DateMoreThan(controlName: string, thanControlName: string) { return (formGroup: FormGroup) => { const control = formGroup.controls[controlName]; const thanControl = formGroup.controls[thanControlName]; if (control.errors && !control.errors.mustBeMoreThan) { return; } if (new Date(control.value) < new Date(thanControl.value)) { control.setErrors({ mustBeMoreThan: true }); } else { control.setErrors(null); } } }
Où nous comparons la date du contrôle avec le nom controlName
pour contrôler avec le nom thanControlName
. Ici fonctionne exemple sur stackblitz . J'espère que cela vous aidera.
Je veux une autre façon de valider, je veux créer une fonction de validation personnalisée @Amir
Il s'agit d'une fonction de validation personnalisée, jetez un œil à l'exemple et voyez comment elle est enregistrée dans formcontrol
Je ne souhaite pas utiliser la fonction de validation personnalisée Étant donné que mon formulaire contient de nombreux champs et que ce n’est pas la méthode recommandée pour placer le validateur au niveau du groupe de formulaires, avez-vous d’autres alternatives?
Vous pouvez le faire en utilisant le service, par exemple, mais vous devrez définir manuellement les erreurs pour les contrôles.
Au lieu de créer une fonction de validation personnalisée, vous pouvez utiliser la validation minDate de @rxweb Voici le code:
ngOnInit(){ this.userForm = this.formBuilder.group({ 'birthDate':[''], 'admissionDate': ['',RxwebValidators.minDate({fieldName:"birthDate"})] }); } }
Voici le Stackblitz fourchu
si vous effectuez une validation sur un contrôle, vous pouvez utiliser parent pour obtenir le formGroup
this.userForm = this.formBuilder.group({ 'birthDate':['11/12/2016'], 'admissionDate': ['11/12/2016',DateMoreThan('birthDate')] }); } export function DateMoreThan(thanControlName: string) { return (control: AbstractControl) => { if (!control.parent) return null const formGroup=control.parent as FormGroup; const thanControl = formGroup.controls[thanControlName]; if (thanControl) { const [day, month, year] = control.value.split("/") const [day2, month2, year2] = thanControl.value.split("/") return new Date(year2,month2-1,day2).getTime()>new Date(year,month-1,day).getTime()? { mustBeMoreThan: true }:null } } }
Comme le montre l'exemple ci-dessous, nous pouvons créer un validateur personnalisé afin de comparer deux champs dueDate et repeatUntilDate. Et puis nous pouvons appliquer ce validateur à l'instance formGroup présente dans la classe de composant. Pour obtenir des explications plus détaillées sur l'utilisation du validateur personnalisé pour les formulaires réactifs, regardez cette vidéo a>. export const dateValidator: ValidatorFn = (control: FormGroup) : ValidationErrors | null => {
const dueDate = control.get('dueDate');
const recurrenceType = control.get('recurrenceType');
const repeatUntil = control.get('repeatUntil');
return dueDate && recurrenceType && repeatUntil && recurrenceType.value != 'NONE'
&& dueDate.value >= repeatUntil.value ? {dueDateGtEqRepeatUntil: true} : null;
};