J'ai besoin d'aide pour la validation de formArray
dans forme réactive. Je veux valider chaque élément du tableau, mais je ne sais pas comment faire. Merci.
code html:
<label for="name">name:</label>
<input formControlName="name" id="name" type="text">
<div *ngIf="name.invalid && (name.dirty || name.touched)">
<div *ngIf="name.errors.required">
required
</div>
</div>
Code TypeScript:
createForm() {
this.form = this.fb.group({
person: this.fb.array([this.initItemRows()])
});
}
initItemRows() {
return this.fb.group({
name: [''],
info: ['']
});
}
addNewRow() {
const control = <FormArray>this.form.controls['person'];
control.Push(this.initItemRows());
}
deleteRow(index: number) {
const control = <FormArray>this.form.controls['person'];
control.removeAt(index);
}
get name() { return this.form.get('person.name'); }
get info() { return this.form.get('person.info'); }
J'ai essayé ceci:
initItemRows() {
return this.fb.group({
name: ['', Validators.required ],
info: ['', Validators.required ]
});
}
Ça ne marche pas ..
Vos getters pour name
et info
ne ciblent en fait pas les contrôles de formulaire spécifiques, car votre person
est un formArray, par exemple this.form.get('person.name');
n'existe pas dans votre formulaire. Ce que vous devez faire, c'est utiliser l'itération pour chaque groupe de formulaires et cibler ce groupe avec ses contrôles, de sorte que votre modèle devrait ressembler à ceci:
<div *ngFor="let p of form.controls.person.controls; let i = index"
[formGroupName]="i">
<label for="name">name:</label>
<input formControlName="name" id="name" type="text">
<!-- check if the name in this group has the error -->
<div *ngIf="p.controls.name.dirty">
<div *ngIf="p.hasError('required', 'name')">Required</div>
</div>
</div>
De plus, une suggestion est que vous pouvez raccourcir un peu votre code et supprimer une méthode qui n'est pas vraiment nécessaire pour initialiser/ajouter un groupe de formulaires à votre tableau, donc ici j'ai supprimé les addNewRow
, initItemRows
peut être appelé lorsque vous souhaitez ajouter une nouvelle ligne.
this.form = this.fb.group({
person: this.fb.array([])
});
this.initItemRows();
initItemRows() {
let ctrl = <FormArray>this.form.controls.person;
ctrl.Push(this.fb.group({
name: ['', Validators.required],
info: ['', Validators.required]
}))
}