使用反应式 formarray 进行角度材料表排序

Sne*_*l P 2 material-design angular-material angular angular-material-table material-table

我正在尝试使用 formArray 作为输入数据源在角度材料表上实现排序/过滤。

StackBlits 代码链接

dataSource = new MatTableDataSource([]);
<table mat-table [dataSource]="formdataarray.controls" multiTemplateDataRows class="mat elevation-z8" matSort >
<ng-container  matColumnDef="{{column}}" *ngFor="let column of columnsToDisplay" >
<th mat-header-cell *matHeaderCellDef mat-sort-header>{{column}}</th>
<td mat-cell *matCellDef="let element"> {{ element.value[column] }}  </td>
</ng-container>
Run Code Online (Sandbox Code Playgroud)

但排序/过滤不起作用

yur*_*zui 5

您在这里有两个选择:

  • 使用普通数组formdataarray.controls作为 adataSource并实现所有 DataSource 方法,例如过滤器,按您自己的排序。或者编写自定义 CDK DataSource 实现。另请参阅https://blog.angular-university.io/angular-material-data-table/

  • 使用MatTableDataSource和调整过滤和排序逻辑来支持AbstractControl对象。

html

<table mat-table [dataSource]="dataSource"
Run Code Online (Sandbox Code Playgroud)

ts

ngOnInit() {
  // fill FormArray
  ...
  this.dataSource.data = this.formdataarray.controls;
  this.dataSource.sortingDataAccessor = (data: AbstractControl, sortHeaderId: string) => {
    const value: any = data.value[sortHeaderId];
    return typeof value === 'string' ? value.toLowerCase() : value;
  };

  const filterPredicate = this.dataSource.filterPredicate;
  this.dataSource.filterPredicate = (data: AbstractControl, filter) => {
    return filterPredicate.call(this.dataSource, data.value, filter);
  }
}
Run Code Online (Sandbox Code Playgroud)

叉式堆栈闪电战

另外,如果您想添加新项目,您也FormArray应该更新。this.dataSource.data另请参见使用 FormArray 的 Angular Material 可编辑表