Проблема заключается в создании FormArray
-свойства savedItems
, а также этой строки:
...
savedItems: this.formBuilder.array([this.createBox()])
...
Эти строки означают, что вы определяете только один FormGroup
в вашем FormArray
итак что у вас есть один элемент с index = 0
.
В вашем файле шаблона вы в блоке для savedItems
у вас есть два цикла:
1.) *ngFor="let item of getSavedItems.controls; let i = index;"
Это правильный цикл и даст вам правильную функциональностьдля removeAt
.
2.) *ngFor="let trailer of trailerModelList; let x = index;"
Это неправильный цикл, поскольку вы не можете создавать FromArray
-элементы из шаблона, как у вас сейчас.
Проблема вкратце: При нажатии кнопки Remove entry
обе (все) savedItems
будут удалены из массива, поскольку у вас есть только один элемент с индексом = 0 в FormArray
.
Решение:
Шаг 1: Создайте для каждого trailerModelList
-элемента FormArray
с createBox()
-методом.
ngOnInit() {
this.boxForm = this.formBuilder.group({
items: this.formBuilder.array([this.createBox()]),
savedItems: this.formBuilder.array([])
});
this.trailerModelList = new Array();
this.trailerModelList.push(new TrailerModel(1, 'test', 'London', 'Paris'));
this.trailerModelList.push(new TrailerModel(2, 'test2', 'Amsterdam', 'Berlin'));
this.trailerModelList.forEach(item => {
(this.boxForm.get('savedItems') as FormArray).controls.push(this.createBox(item.name, item.fromLocation, item.toLocation));
});
}
....
createBox(name: string = null, origin: string = null, to: string = null): FormGroup {
return this.formBuilder.group({
name: [name, [Validators.required, Validators.minLength(3)]],
origin: [origin, [Validators.required, Validators.minLength(1)]],
to: [to, [Validators.required, Validators.minLength(1)]]
});
}
Шаг 2: Удалите следующую петлю из шаблона: *ngFor="let trailer of trailerModelList; let x = index;"
Шаг 3: Добавьте formControlName
-объектэлементы формы внутри этой петли: *ngFor="let item of getSavedItems.controls; let i = index;"
<div class="row" formArrayName="savedItems" *ngFor="let item of getSavedItems.controls; let i = index;" >
<div>
<div class="form-group" [formGroupName]="i" style="margin-bottom: 10px">
<div>
<div class="col-sm-5 form-group">
<label for="name">Origin</label>
<input class="form-control" type="text" placeholder="From" formControlName="origin"/>
</div>
<div class="col-sm-5 form-group">
<label for="name">Destination</label>
<input class="form-control" type="text" placeholder="To" formControlName="to" />
</div>
<div class="col-sm-3 form-group">
<label for="name">Name</label>
<input class="form-control" type="text" placeholder="Name" formControlName="name"/>
</div>
<div class="col-xs-2">
<button class="btn btn-danger" type="button" (click)="removeSavedItem(i)">Remove Entry</button>
</div>
</div>
</div>
</div>
</div>
Вот stackblitz с рабочим решением.