Я думаю, что вы могли бы использовать .filter или использовать другой подход, когда вы создаете новый объект (массив) для своего списка, чтобы предотвратить проблемы со сращиванием, которое изменяет ваш исходный массив и портит ваши индексы.
Вот возможная реализация:
https://stackblitz.com/edit/ionic-qz5zfx
<ion-content padding>
<ion-list>
<ion-item-sliding *ngFor="let object of objectList; let idx = index">
<ion-item>
<ion-input type="text" text-left [(ngModel)]="objectList[idx].name" placeholder="Name"></ion-input>
<ion-input type="text" text-right [(ngModel)]="objectList[idx].amount" placeholder="Amount"></ion-input>
</ion-item>
<ion-item-options side="end">
<button ion-button color="danger" (click)="deleteObject(idx)">
<ion-icon slot="icon-only" name="trash"></ion-icon>
</button>
</ion-item-options>
</ion-item-sliding>
</ion-list>
<button ion-button block color="primary" (click)="addObject()">
<ion-icon slot="icon-only" name="add"></ion-icon> Add Item
</button>
</ion-content>
TS:
import { Component } from '@angular/core';
import { NavController } from 'ionic-angular';
@Component({
selector: 'page-home',
templateUrl: 'home.html'
})
export class HomePage {
objectList = [
{ name: "item1", amount: 1 },
{ name: "item2", amount: 2 },
{ name: "item3", amount: 3 },
{ name: "item4", amount: 4 },
{ name: "item5", amount: 5 },
]
constructor(public navCtrl: NavController) {
}
public deleteObject(objectIndex) {
this.objectList = this.objectList.filter( (item, index) => {
if (index !== objectIndex) return true;
})
}
public addObject() {
this.objectList.push({ name: 'newItem', amount: 25 });
}
}
Когда вы используете метод filter, он создает новый массив, который вы можете назначить обратно в свой objectList, таким образом вы не изменяете свой objectList, а переопределяете его новым массивом, который обнаружение изменений angular будет использовать, чтобы «перерисовать список и переназначение индексов.
ОБНОВЛЕНИЕ для IONIC4:
Ionic 4 требует, чтобы вы вызывали определенный метод, чтобы закрыть скользящие элементы перед удалением элементов: https://github.com/ionic-team/ionic/issues/15486#issuecomment-419924318
Итак, код шаблона должен быть:
<ion-content>
<ion-list #dynamicList>
<ion-item-sliding *ngFor="let object of objectList; let idx = index">
<ion-item>
{{ object.name }}
</ion-item>
<ion-item-options side="end">
<ion-button color="danger" (click)="dynamicList.closeSlidingItems(); deleteObject(idx)">
<ion-icon slot="icon-only" name="trash"></ion-icon>
</ion-button>
</ion-item-options>
</ion-item-sliding>
</ion-list>
<ion-button block color="primary" (click)="addObject()">
<ion-icon slot="icon-only" name="add"></ion-icon> Add Item
</ion-button>
</ion-content>