Formarray inside formArray in angular 4
13,813
This link is more of a gist to the problem but you can take a look at this project i created on stackblitz which has deep nested forms .
Related videos on Youtube
Author by
user3419304
Updated on May 30, 2022Comments
-
user3419304 almost 2 years
I am trying to implement formarray inside formarray but its not working, tried below too but doesn't work.
How to get FormArrayName when the FormArray is nested in another FormArray?
could someone please help me where am i doing wrong in below code
HTML
<div [formGroup]="MainFormGroup" class="custom-auto-complete"> <mat-radio-group matInput formControlName="Applies"> <mat-radio-button *ngFor="let applie of applies" [value]="applie.id">{{applie.value}}</mat-radio-button> </mat-radio-group> <div formArrayName="FormArrayOne"> <div *ngFor="let mains of MainFormGroup.get('FormArrayOne')['controls']; let i=index"> <div [formGroupName]="i"> <mat-icon *ngIf="MainFormGroup.get('FormArrayOne').length > 1" (click)="removeMarket(i)">remove_circle</mat-icon> <mat-icon (click)="addOne()"> add_circle</mat-icon> <mat-form-field> <input matInput formControlName="OneField" value=""> </mat-form-field> <div formArrayName="FormArrayTwo"> <div *ngFor="let Market of MainFormGroup.get('FormArrayTwo')['controls']; let j=index" > <div [formGroupName]="j"> <mat-form-field class="formfieldsControl"> <input matInput formControlName="Destination"> </mat-form-field> </div> </div> </div> </div> </div> </div> </div>
TS
public ngOnInit() { this.MaintFormGroup = this._fb.group({ Applies : '', FormArrayOne: this._fb.array([ this.initArrayOne(), ]) }); } public initArrayOne() { return this._fb.group({ OneField: '', FormArrayTwo : this._fb.array([ this.initFormArrayTwo() ]) }); } public addMarket() { const control = <FormArray> this.MaintFormGroup.get('FormArrayOne'); control.push(this.initArrayOne()); } public removeMarket(i: number) { const control = <FormArray> this.MaintFormGroup.get('FormArrayOne'); control.removeAt(i); } public initFormArrayTwo() { return this._fb.group({ Destination : '' }); } public addFormArrayTwo() { const Control = <FormArray> this.MaintFormGroup.get('FormArrayTwo'); Control.push(this.initFormArrayTwo()); } public removeFormArrayTwo(j: number) { const Control = <FormArray> this.MaintFormGroup.get('FormArrayTwo'); Control.removeAt(j); }
-
user3419304 over 6 yearsI am getting this error if i run the code in my local @Rahul Singh
-
user3419304 over 6 yearsERROR in c:/copa/deep/src/app/app.component.ts (62,60): Property 'controls' does not exist on type 'AbstractControl'. ERROR in c:/copa/deep/src/app/app.component.ts (92,61): Property 'controls' does not exist on type 'AbstractControl'.
-
user3419304 over 6 yearsrenamed .control ==> [control] working fine thanks
-
Rahul Singh over 6 years@user3419304 :)
-
user3419304 over 6 yearsIts seems your code has some bug, if u add three section and then add three options, now if we try to remove options of third its not working now able to remove
-
Rahul Singh over 6 years@user3419304 fixed it
-
user1714346 almost 6 yearsNice example. Thank you for that. But how do i fill that with data on init. Let's say with 3 sections and random numbers of options.... Thank you in advance
-
Alexis almost 4 yearsThanks, it still working well today (Angular 10) :) Just need to cast the whole controls each times on functions
addQuestion
,add
andremoveQuestion
. -
tdios over 2 yearsif you type in some text into the inputs for question, as question 1 and then add another question as question 2. the delete of q2 actually deletes q1.