Поскольку вы фактически удаляете выбранный индекс, но Angular не имеет никакой информации о разнице между значениями, давайте рассмотрим пример:
У нас есть этот массив: [1, 1, 1, 1]
, и вы удалите второй элемент, затем angular перед удалением будет отображаться:
[1, 1, 1, 1]
и после:
[1, 1, 1]
на данный момент angular знает только, что на один пункт меньше, но не знает wi sh item, затем angular просто удаляет последний.
Вам необходимо убедиться, что вы передаете различные значения или ссылки (рекомендуется), тогда angular будет знать, как дифференцировать массив items.
Вы можете исправить это, используя такие объекты, как: { data: 1 }
, ваш массив будет выглядеть так:
[
{ data: 1 },
{ data: 1 },
{ data: 1 },
{ data: 1 }
]
И почему это будет работать? потому что ссылки не совпадают ( Значение против типов ссылок ) и angular будет видеть разные ссылки, даже если данные одинаковы.
Это будет работать для вас:
rows = [{ data: 1 }];
addRow() {
this.rows.push({ data: 1 });
}
deleteRow(row: number) {
this.rows.splice(row, 1);
}
В этом примере вы всегда передаете новый объект со своей собственной ссылкой.
Этот другой пример не будет работать
sameReference = { data: 1 };
rows = [this.sameReference];
addRow() {
this.rows.push(this.sameReference);
}
deleteRow(row: number) {
this.rows.splice(row, 1);
}
, поскольку sameReference
хранит переменную ссылка, а не объект, и angular не будет знать (опять же) различий между элементами, и, кроме того, когда вы изменяете значение данных одного элемента, все элементы получат это значение, поскольку существует только один объект, на который ссылается N раз в течение массив.
И это тоже будет работать
sameReference = { data: 1 };
rows = [{ ...this.sameReference }];
addRow() {
this.rows.push({ ...this.sameReference });
}
deleteRow(row: number) {
this.rows.splice(row, 1);
}
, потому что здесь мы копируем значения объекта в новый объект с другой ссылкой.