NodeJS 我有一个表,使用,角材料,我还添加了matSort的表,我可以看到,我的表的第一列是没有排序任何想法?

zxlwwiss  于 2023-03-17  发布在  Node.js
关注(0)|答案(4)|浏览(173)

TS:

ngOnChanges() { 
    this.dataSource = new MatTableDataSource<Data>(this.someData); //work order data
    this.dataSource.paginator = this.paginator;
    this.dataSource.sort = this.sort;
}

超文本:

<table mat-table [dataSource]="dataSource" matSort>

<!-- column which does not sort is  : -->
            <ng-container matColumnDef="Name">
                <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
                <td data-th="Customer Name" mat-cell *matCellDef="let element"> {{element.party.name}} </td>
            </ng-container>

我已经尝试了所有的方式在谷歌搜索沿着这个网站也仍然没有答案,已经尝试了所有相关的答案:mat-sort-header / mat-sort not working on a particular column
但没有解决办法请帮帮忙。

vxbzzdmp

vxbzzdmp1#

我也遇到过同样的问题。
matColumnDef和属性名称应相同。
在HTML中:

<ng-container matColumnDef="party.name">
                <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
                <td data-th="Customer Name" mat-cell *matCellDef="let element"> {{element.party.name}} </td>
            </ng-container>

在TS中:

displayedColumns = ['party.name']; //change the column name in ts as well.

此外,在分配数据源的位置:

this.datasource.sortingDataAccessor = (item, property) => {
              switch (property) {
                case 'party.name': return item.party.name;
case 'party.age': return item.party.age //if you have other properties as well.
                default: return item[property];
              }
            };

 this.datasource.sort = this.sort;
zqry0prt

zqry0prt2#

这里实际上有两个问题。
1.您没有正确初始化matSort。
您放入ngOnChanges中的代码应位于ngAfterViewInit中(请参见[官方文档](material.angular.io/components/table/overview#sorting,包含工作代码)
1.你必须帮助Material理解如何对你的列进行排序。Material假设列名与你的对象属性相同。所以在这里,Material试图基于element.Name进行排序,而element.Name并不存在。你必须定义sortingDataAccessor,告诉类似于“如果你想对Name列进行排序,请改为查看element.party.name”的内容。

2guxujil

2guxujil3#

更新对不起,我刚刚检查,无法工作,请删除赞成票

使用mat-sort-header='party.name'

<ng-container matColumnDef="Name">
       <th mat-header-cell *matHeaderCellDef 
                        mat-sort-header="party.name"> Name </th>
       <td data-th="Customer Name" mat-cell *matCellDef="let element">
           {{element.party.name}}
       </td>
</ng-container>

By defect short-header获取columnName的值,但您希望按www.example.com排序party.name
最好的办法是向数组的元素添加一个新属性“name”。

更新2关于您的评论

如果从API接收到一个对象数组,如

{party:{name:'',prop1:`''},prop2:''}

您可以按以下方式使用管道Map

return httpClient.get(your url).pipe(map(res:any[])=>{
    //return your array transform
    return res.map(x=>({
         name:x.party.name,
         prop1:x.party.prop1,
         prop2:x.prop2
    })
}))

所以你的元素阻碍了

{name:'',prop1:'',prop2:''}

并以“正常方式”使用垫桌

lo8azlld

lo8azlld4#

我们无法使用对象进行排序,因为MatTableDataSource中的函数sortingDataAccessor是如何定义的(参见github)。
但是我们可以创建一个类来覆盖这个函数

export class ObjectMatTableDataSource<T> extends MatTableDataSource<T>{
  override sortingDataAccessor= (
    data: T,
    sortHeaderId: string,
  ): string | number => {
    const part=sortHeaderId.split('.')
    let value = (data as unknown as Record<string, any>)[part[0]];
    for (let i=1;i<part.length;i++)
      value = value[part[i]];
  
    if (!isNaN(parseFloat(value as any)) && !isNaN(Number(value))) {
      const numberValue = Number(value);
      const MAX_SAFE_INTEGER = 9007199254740991;
  
      return numberValue < MAX_SAFE_INTEGER ? numberValue : value;
    }
  
    return value;
  };
}

现在我们可以用

dataSource = new ObjectMatTableDataSource(ELEMENT_DATA);

我们可以使用mat-sort-header这样的名称:“party.name“
请参见stackblitz中的示例

相关问题