【问题标题】:Sorting using mat-table for nested properties使用 mat-table 对嵌套属性进行排序
【发布时间】:2018-12-12 14:08:50
【问题描述】:

我有下表

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

<!-- Name Column -->
<ng-container matColumnDef="employee.name">
    <th mat-header-cell *matHeaderCellDef mat-sort-header> Name </th>
    <td mat-cell *matCellDef="let employeeWrapper">{{employeeWrapper.employee.name}}</td>
    </ng-container>

    <ng-container matColumnDef="id">
        <th mat-header-cell *matHeaderCellDef mat-sort-header> ID </th>
        <td mat-cell *matCellDef="let employeeWrapper">{{employeeWrapper.id}}</td>
    </ng-container>

    <tr mat-header-row *matHeaderRowDef="tableColumns"></tr>
    <tr mat-row *matRowDef="let row; columns: tableColumns;"></tr>
</table>

来自this answermatColumnDef对象属性必须同名。

我找到了 employeeWrapper.id 的正确结果,并且排序正常。

但对于employeeWrapper.employee.name,它是二级属性。将matColumnDef 设置为employee.namename 不起作用。我都试过了。

这个问题有解决方案吗?

【问题讨论】:

    标签: javascript angular angular-material mat-table


    【解决方案1】:

    您可以编写一个小辅助函数来计算给定路径的嵌套属性的值,并使用它来覆盖 dataSource 的默认 sortingDataAccessor,类似于

    getPropertyByPath(obj: Object, pathString: string){
      return pathString.split('.').reduce((o, i) => o[i], obj);
    }
    
    dataSource.sortingDataAccessor = (data, sortHeaderId: string) => {
      return getPropertyByPath(data, sortHeaderId);
    };
    

    您还必须将mat-header-cellmat-sort-header 属性设置为等于您的嵌套属性字符串(请参阅演示以获得说明)。

    Stackblitz demo

    【讨论】:

    • 您的回答完美。我只需要做一个小的修正。 getPropertyByPath(data.value, sortHeaderId) => getPropertyByPath(data, sortHeaderId)
    猜你喜欢
    • 1970-01-01
    • 2019-08-15
    • 1970-01-01
    • 1970-01-01
    • 2015-10-20
    • 1970-01-01
    • 2019-08-08
    • 1970-01-01
    • 2021-03-04
    相关资源
    最近更新 更多