【问题标题】:Angular- Material table sorting not working in proper wayAngular-材料表排序无法正常工作
【发布时间】:2020-11-05 07:10:17
【问题描述】:

我正在创建一个应按文件名和日期排序的表,我为此目的遵循了 Angular Material 文档,但它不起作用,它没有在编译器或浏览器控制台中显示任何错误,该表如下所示:

<mat-table [dataSource]="dataSource" matSort>
      <ng-container matColumnDef="File">
        <mat-header-cell *matHeaderCellDef mat-sort-header> File </mat-header-cell>
        <mat-cell  *matCellDef="let element" data-label="File"> {{element.fileName}} </mat-cell>
      </ng-container>

      <!-- Name Column -->
      <ng-container matColumnDef="Date">
        <mat-header-cell  *matHeaderCellDef mat-sort-header>Date </mat-header-cell>
        <mat-cell  *matCellDef="let element" data-label="Date"> {{element.date}} </mat-cell>
      </ng-container>
      <!-- Weight Column -->
      <ng-container matColumnDef="Extension">
        <mat-header-cell *matHeaderCellDef mat-sort-header>Extension</mat-header-cell>
        <mat-cell  *matCellDef="let element" data-label="Extension"> {{element.extension}} </mat-cell>
      </ng-container>



      <ng-container matColumnDef="View">
        <mat-header-cell *matHeaderCellDef> Actions </mat-header-cell>
        <mat-cell  *matCellDef="let element" data-label="View"> <a href="{{element.url}}" target="_blank" class="green-text"><i class="material-icons">visibility</i></a></mat-cell>
      </ng-container>

      <ng-container matColumnDef="Delete">
        <mat-header-cell *matHeaderCellDef> Delete </mat-header-cell>
        <mat-cell  *matCellDef="let element" data-label="Delete"> <a class="red-text"><i class="material-icons">delete_forever</i></a></mat-cell>
      </ng-container>
      <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row>
      <mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
    </mat-table>

这是我的 ts 代码

export class FilesComponent implements OnInit {
  displayedColumns: string[] = ['File', 'Extension', 'Date', 'View', 'Delete'];
  dataSource = new MatTableDataSource<Files>(ELEMENT_DATA);
  data = ELEMENT_DATA;
  selects: any;
  @ViewChild(MatPaginator, {static: true}) paginator: MatPaginator;
  @ViewChild(MatSort, {static: true}) sort: MatSort;
  constructor(private addFile: MatDialog) {
  }

  ngOnInit(): void {
    this.Materialize();
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
  }

  Materialize() {
    this.selects = document.querySelectorAll('select');
    M.FormSelect.init(this.selects);
  }

  changeFiles(value) {
    console.log('option:', value);
    switch (parseInt(value)) {
      case 1:
        this.dataSource = new MatTableDataSource<Files>(ELEMENT_DATA);
        break;
      case 2:
        this.dataSource = new MatTableDataSource<Files>(Charts);
        break;
      case 3:
        this.dataSource = new MatTableDataSource<Files>(Documents);
        break;
      default:
        this.dataSource = new MatTableDataSource<Files>(ELEMENT_DATA);
        break;
    }
    this.dataSource.sort = this.sort;
    this.dataSource.paginator = this.paginator;
  }
}

事件应用的排序标题和样式(用于排序的箭头)出现在数据未排序的表中。

【问题讨论】:

标签: angular angular-material mat-table


【解决方案1】:

matColumnDef 名称和 *matCellDef 实际值名称应该相同

在component.html中

改变

<ng-container matColumnDef="File"> <mat-header-cell *matHeaderCellDef mat-sort-header> File </mat-header-cell> <mat-cell *matCellDef="let element" data-label="File"> {{element.fileName}} </mat-cell></ng-container>

<ng-container matColumnDef="fileName"> <mat-header-cell *matHeaderCellDef mat-sort-header> File </mat-header-cell> <mat-cell *matCellDef="let element" data-label="File"> {{element.fileName}} </mat-cell> </ng-container>

在ts中:

改变

displayedColumns: string[] = ['File', 'Extension', 'Date', 'View', 'Delete'];

displayedColumns: string[] = ['fileName', 'Extension', 'Date', 'View', 'Delete'];

【讨论】:

    【解决方案2】:

    您需要将MatSortModule 添加到app.module.ts 中的导入数组中

    【讨论】:

      【解决方案3】:

      @user12129132 的答案适用于正常排序(您需要更改数据源中的字段值以匹配列定义中的字段值并在 matColumn 定义中使用相同的值)但是您的文件名中包含数字,它不会被正确排序。为此我们可以使用sortingDataAccessor。

      在此处查看工作版本 - Stackblitz:https://stackblitz.com/edit/angular-g4svyj

        ngAfterViewInit() {    
        this.dataSource.sort = this.sort;
        this.dataSource.sortingDataAccessor = (data, attribute) => {
          let formattedData=data[attribute]
          if(attribute=="fileName")
          {  
             formattedData=parseInt(formattedData.match(/(\d)*$/)[0]);
          }
          return formattedData;
        };
         this.dataSource.paginator = this.paginator; 
        }
      

      【讨论】:

      • 感谢我现在只使用假数据,但当他们给我真实数据时我会记住这一点
      猜你喜欢
      • 2020-03-25
      • 1970-01-01
      • 2020-04-11
      • 2018-05-27
      • 1970-01-01
      • 2017-09-19
      • 2019-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多