我能够解决这个问题。
基本上有两个数组,一个是dates
我要遍历以呈现日期的数组,另一个数组是包含表示屏幕上显示的每个日期的 DOM 元素的数组。Angular 不关心日期在 component.ts 文件中存在的数组中的内容id
或索引。dates
默认情况下,它ngFor
通过 DOM 数组中的索引跟踪循环中的每个元素。对于发生的每个添加/删除操作,此数组都会不断变化。
我犯的错误是我使用 DOM 数组索引作为id
日期。现在由于删除了任何日期,DOM 数组正在刷新,并且由于我从未真正从数组中删除或拼接日期,所以数组中总是有一些重复id
的 's。
应该有一个单独的 ID 生成函数,或者可能只是一个数字类型的属性,它在每次pushDate()
操作时都会不断增加。这将在一定程度上解决id
重复问题。虽然,Angular 仍然不关心id
它,它只能通过它在 DOM 数组中的索引来识别每个日期元素,所以,为了删除一个特定的日期,你需要它在 DOM 数组中的索引。
<app-date *ngFor="let date of dates | callback: filterDates; index as i" [id]="dateID" (delete)="del(i, $event)"></app-date>
现在,(delete)
将返回一个显示日期的字符串,例如:2020-8-15。此日期以及action
该特定日期的属性将标识要设置为的日期deleted
。这是我的做法:
getArrayIndex = (index: number, date: string): number => {
for (let i = 0; i < this.dates.length; i++) {
if(i == index && date == this.dates[i]['date']) {
if(this.dates[i]['action'] == 'deleted') {
return this.getArrayIndex(i + 1, date);
}
else {
return i;
}
}
else if(i == index && date != this.dates[i]['date']) {
return this.getArrayIndex(i + 1, date);
}
else if(i != index) {
continue;
}
else {
return i;
}
}
}
del = (num: number, event: string) => {
let i = this.getArrayIndex(num, event);
this.dates[i]['action'] = 'deleted';
}
该函数首先通过 找到数组del
中要删除的日期的正确索引。一旦找到,该特定日期对象的属性将设置为。dates
getArrayIndex()
date
action
"deleted"