typescript - Angular 2 Accesarea FormArrays cu Structură Înnădămată folosind FormBuilder
În primul rând, tocmai am început cu Angular 2 și încerc să construiesc un formular imbricat și să îl validez.
Iată o parte din fișierul meu ts:
ngOnInit() {
this.myForm = this.formBuilder.group({
projects: this.formBuilder.array([
this.initProjects()
])
});
}
initProjects(): any {
return this.formBuilder.group({
name: ['', [Validators.required, Validators.minLength(3)]],
some_array: this.formBuilder.array([
this.formBuilder.group({
name: ['', Validators.required],
attr: ['', Validators.required],
some_id: [1, Validators.required]
})
])
});
}
addProject(): void {
const control = < FormArray > this.myForm.controls['projects'];
control.push(this.initProjects());
}
Vizualizare :
<form [formGroup]="myForm" novalidate (ngSubmit)="onSubmit(myForm)">
<div formArrayName="projects">
<div *ngFor="let project of myForm.controls.projects.controls; let i = index">
<div [formGroupName]="i">
<md-input placeholder="Name" formControlName="name"></md-input>
</div>
<div *ngFor="let some_obj of project.controls.some_array.controls; let x = index">
<div [formGroupName]="x">
<div>
<md-input placeholder="Nome" formControlName="controls.some_array.controls.name"></md-input>
<small *ngIf="!some_obj.controls.name.valid">
Nome é requerido
</div>
<md-input type="number" placeholder="Cost" formControlName="controls.some_array.controls.attr" required></md-input>
</div>
</div>
</div>
</div>
<button type="submit" md-raised-button color="primary" [disabled]="!myForm.valid">Submit</button>
</form>
<pre>form value: <br>{{myForm.value | json}}</pre>
Valoarea de ieșire a formularului:
form value:
{
"projects": [
{
"name": "",
"some_array": [
{
"name": "",
"attr": "",
"some_id": 1
}
]
},
{
"name": "",
"some_array": [
{
"name": "",
"attr": "",
"some_id": 1
}
]
}
]
}
Ei bine, după cum puteți vedea, am niște array-uri numite projects, fiecare având câte un array în interior.
Deci problema este că nu pot valida fiecare control din array-ul some_array.
De fapt, primesc următoarea eroare:
EXCEPȚIE ORIGINALĂ: Nu poate fi găsit controlul cu calea: 'projects -> 0 -> controls.some_array.controls.name PS: Am încercat deja să îl pun într-un div, așa cum urmează:
Dar am primit și o eroare:
Nu se poate găsi controlul cu calea: 'projects -> some_array'. Mulțumesc anticipat. Orice ajutor ar fi apreciat.
Răspuns #1
Încearcă următorul HTML:
<form [formGroup]="myForm" novalidate (ngSubmit)="onSubmit(myForm)">
<div formArrayName="projects">
<div [formGroupName]="i" *ngFor="let project of myForm.controls.projects.controls; let i = index">
<md-input placeholder="Name" formControlName="name"></md-input>
<div formArrayName="some_array">
<div [formGroupName]="x" *ngFor="let some_obj of project.controls.some_array.controls; let x = index">
<div>
<md-input placeholder="Nome" formControlName="name"></md-input>
<small *ngIf="!some_obj.controls.name.valid">Nome é requerido
</div>
<md-input type="number" placeholder="Cost" formControlName="attr" required></md-input>
</div>
</div>
</div>
</div>
<button type="submit" md-raised-button color="primary" [disabled]="!myForm.valid">Submit</button>
</form>
<pre>form value: <br>{{myForm.value | json}}</pre>
Răspunsul #2
Am întâmpinat aceeași problemă când s-au folosit paranteze în jurul unui formControlName imbricat. De exemplu (asta este greșit):
<div formArrayName="options">
<ion-row *ngFor="let option of addProductForm.controls.options.controls; index as i;">
<ion-col no-padding [formGroupName]="i">
<ion-item>
<ion-label floating>Name</ion-label>
<ion-input type="text" [formControlName]="option_name"></ion-input>
</ion-item>
</ion-col>
</ion-row>
</div>
formControlName="option_name" trebuie să fie FĂRĂ paranteze
