Angular - 如何通过过滤后的 table 中的索引更新 table 元素?

Angular - How to update table element via its index in a filtered table?

我有一个 table,它从 MatTableDataSource 获取数据。数据源包含一个过滤器,可用于仅显示 table 中具有特定属性设置为 truefalse 的元素。这就是我在 ngOnInit() 函数中将过滤器添加到数据源的方式:

this.dataSource.filterPredicate = function (record, filter) {
  return record.disabled === ConverterService.toBoolean(filter);
};

this.dataSource.filter = "false";

在 table 中,每个元素都有一个按钮,单击该按钮可以打开编辑对话框,以便用户可以更改任何元素属性。关闭对话框后,我使用 table 索引用编辑对话框返回的新元素覆盖旧元素。打开对话框并更新 table 数据的函数如下所示:

  editProjectDialog(projectId: number, index: number, $event: MouseEvent) {
    $event.stopPropagation();
    const dialogRef = this.dialog.open(EditProjectDialogComponent, {
      data: projectId,
    });
    dialogRef.afterClosed().subscribe((result) => {
      this.projects[index] = result;
      this.dataSource.data = this.projects;
    });
  }

函数是这样调用的:

 <ng-container matColumnDef="edit">
    <th mat-header-cell *matHeaderCellDef>Edit</th>
    <td mat-cell *matCellDef="let element; let index = index">
      <button
        mat-icon-button
        (click)="editProjectDialog(element.id, index, $event)"
        matTooltip="Edit"
      >
        <mat-icon>edit</mat-icon>
      </button>
    </td>
  </ng-container>

这段代码过去在没有向数据源添加过滤器时工作得很好,但现在它不再工作了,因为 table 中的索引与 [=20= 中的索引不匹配] 数组(因为 projects 数组包含所有元素,索引仅针对显示在 table 中的筛选元素)。我还尝试通过将 this.projects[index] 替换为 this.dataSource.data[index] 甚至 this.dataSource.filteredData[index] 来直接修改元素,但是 none 似乎有效。如何更新数据源中已编辑的元素以将更改应用到 table?

您可能可以使用其他方法获得正确的索引。如何在 projects 数组中查找元素,如下所示:

const rightIndex = this.projects.findIndex(item => item.id === result.id);
this.projects[rightIndex] = result;
this.dataSource.data = this.projects;

找到正确的索引后,就可以继续替换元素了。您可能需要在将项目数组分配为 dataSource.data 时解构它,如下所示:this.dataSource.data = [...this.projects];