简体   繁体   English

Angular-材料表排序无法正常工作

[英]Angular- Material table sorting not working in proper way

I'm creating a table that should sort by file name and date I followed the Angular Material documentation for this purpose but is not working, it's not showing any errors in the compiler or the browser console, the table looks like this:我正在创建一个应按文件名和日期排序的表,为此我遵循了 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>

and this is my ts code这是我的 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;
  }
}

event the sort header it's applied and the styles (the arrows for the sort) appear in the table the data does not sort.事件它应用的排序标题和样式(排序的箭头)出现在数据未排序的表中。

matColumnDef name and *matCellDef actual value name should be same matColumnDef 名称和 *matCellDef 实际值名称应相同

In component.html在 component.html

Change改变

<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>

to

<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>

In ts:在 ts:

change改变

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

to

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

您需要添加MatSortModule在进口阵列app.module.ts

@user12129132's answer will work for normal sorting ( You need to change the field values in the datasource to match the field values in the column definitions and also use the same in matColumn definition) but you have filename with numbers in it, it wont be sorted properly.For that purpose we can use sortingDataAccessor. @user12129132 的答案适用于正常排序(您需要更改数据源中的字段值以匹配列定义中的字段值,并在 matColumn 定义中使用相同的值)但您的文件名中包含数字,它不会被排序正确。为此我们可以使用sortingDataAccessor。

See the working version here - Stackblitz: https://stackblitz.com/edit/angular-g4svyj在此处查看工作版本 - 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; 
  }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM