Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Angular removeAt always remove last element from FormArray

I have following form. arr is a list of FormBuilder.

  get arr() {
    return this.form.get('arr') as FormArray;
  }


  this.form = this.fb.group({
      id: this.fb.control(''),
      name: this.fb.control('', Validators.required),
      arr: this.fb.array([], Validators.minLength(1)),
    });



  public removeArr(idx: number) {
    this.arr.removeAt(0);
  }

As you can see this.arr.removeAt(0), I am trying to remove first arr from the list, but it always removes the last element. Even I change it to something else e.g this.arr.removeAt(2), instead of removing the third element it removes the last element.

How can I remove any element given by idx instead of always removing the last element.

Note:

Looks like the problem is related to the trackby function.

<form *ngIf="form" [formGroup]="form">
  <mat-form-field appearance="outline">
    <mat-label>Name</mat-label>
    <input type="text" matInput formControlName="name" required />
  </mat-form-field>


   <div
        class="arr-row"
        *ngFor="let control of arrControls; let i = index; trackBy: trackByIndex"
        [formGroupName]="i"
      >

        <mat-form-field appearance="outline">
          <mat-label>Name</mat-label>
          <input type="text" matInput formControlName="name" required />
        </mat-form-field>


        <button mat-icon-button type="button" (click)="removeArr(i)">
          <mat-icon>delete</mat-icon>
        </button>

   </div>


</form>

   trackByIndex: TrackByFunction<FormControl> = (index, _) => index;

If I change trackby function to

   trackByIndex: TrackByFunction<FormControl> = (index, v) => v.value.id;

Then it works but not all of the elements has id, so I can not use id here.

like image 485
StaticName Avatar asked Oct 27 '25 14:10

StaticName


1 Answers

Had same issue, solution was to track something meaningful and unique in *ngFor, insead of index:

@for (article of articles(); track article.id; let index = $index)
like image 135
Max Tuzenko Avatar answered Oct 30 '25 03:10

Max Tuzenko



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!