我可以使用 MatTable 按选定的行排序吗?
Can I sort by selected rows using a MatTable?
我有一个 MatTable,它实现了 Angular Material 的 documentation
所指示的选择
一切正常,选择已完成,等等;但我在想是否可以应用某种排序,这样我就可以对数据源进行排序,以便首先显示选定的行。
<table mat-table matSort [dataSource]="dataSourcePPC" class="w-100 table-bordered table-hover">
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let row" class="text-center">
<mat-checkbox (click)="$event.stopPropagation()" (change)="$event ? selectionPPC.toggle(row) : null;"
[checked]="selectionPPC.isSelected(row)">
</mat-checkbox>
</td>
</ng-container>
<ng-container matColumnDef="type">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Type </th>
<td mat-cell *matCellDef="let ppc">{{ ppcTypeModel[ppc.type] }}</td>
</ng-container>
...
<tr mat-header-row *matHeaderRowDef="displayedColumnsPPC"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumnsPPC;" [ngClass]="{'selected': selectionPPC.isSelected(row)}" (click)="selectionPPC.toggle(row)"></tr>
</table>
我正在研究 sortingDataAccesor
函数,但我真的不明白它是如何工作的;感谢您对此提供任何帮助。
你可以这样做。
这就是复选框的工作原理。
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef>
<mat-checkbox (change)="$event ? masterToggle() : null" [checked]="selection.hasValue() && isAllSelected()"
[indeterminate]="selection.hasValue() && !isAllSelected()" [aria-label]="checkboxLabel()">
</mat-checkbox>
<div mat-sort-header>
<mat-icon>ac_unit</mat-icon>
</div>
</th>
<td mat-cell *matCellDef="let row">
<mat-checkbox (click)="$event.stopPropagation()" (change)="$event ? selection.toggle(row) : null"
[checked]="selection.isSelected(row)" [aria-label]="checkboxLabel(row)">
</mat-checkbox>
</td>
</ng-container>
用打字稿写。
this.dataSource.sortingDataAccessor = (item, property) => {
switch (property) {
case 'select': return this.selection.selected.includes(item);
case 'nestedObject': return item.parentObject.childObject;
default: return item[property];
}
};
基本上,因为当数据传递给 sortingDataAccessor 时我的 matColumnDef 是 'select',您需要检查它是否匹配 'select'。一旦您知道它与 'select' 匹配,您就可以检查您的项目(即当前行)是否包含在所选项目的数组(selection.selected 数组)中。
selection = new SelectionModel(true, []); // you already should have this since you have select.
我还介绍了如何对嵌套对象进行排序。如果你需要它。如果您有嵌套对象,则需要在 switchcase 中编写类似 case 'nestedObject' 的内容。 'nestedObject' 就是您在 table 中对专栏的称呼。
我在我的项目中检查过它,它工作正常。
祝你好运!
我有一个 MatTable,它实现了 Angular Material 的 documentation
所指示的选择一切正常,选择已完成,等等;但我在想是否可以应用某种排序,这样我就可以对数据源进行排序,以便首先显示选定的行。
<table mat-table matSort [dataSource]="dataSourcePPC" class="w-100 table-bordered table-hover">
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let row" class="text-center">
<mat-checkbox (click)="$event.stopPropagation()" (change)="$event ? selectionPPC.toggle(row) : null;"
[checked]="selectionPPC.isSelected(row)">
</mat-checkbox>
</td>
</ng-container>
<ng-container matColumnDef="type">
<th mat-header-cell *matHeaderCellDef mat-sort-header> Type </th>
<td mat-cell *matCellDef="let ppc">{{ ppcTypeModel[ppc.type] }}</td>
</ng-container>
...
<tr mat-header-row *matHeaderRowDef="displayedColumnsPPC"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumnsPPC;" [ngClass]="{'selected': selectionPPC.isSelected(row)}" (click)="selectionPPC.toggle(row)"></tr>
</table>
我正在研究 sortingDataAccesor
函数,但我真的不明白它是如何工作的;感谢您对此提供任何帮助。
你可以这样做。
这就是复选框的工作原理。
<ng-container matColumnDef="select">
<th mat-header-cell *matHeaderCellDef>
<mat-checkbox (change)="$event ? masterToggle() : null" [checked]="selection.hasValue() && isAllSelected()"
[indeterminate]="selection.hasValue() && !isAllSelected()" [aria-label]="checkboxLabel()">
</mat-checkbox>
<div mat-sort-header>
<mat-icon>ac_unit</mat-icon>
</div>
</th>
<td mat-cell *matCellDef="let row">
<mat-checkbox (click)="$event.stopPropagation()" (change)="$event ? selection.toggle(row) : null"
[checked]="selection.isSelected(row)" [aria-label]="checkboxLabel(row)">
</mat-checkbox>
</td>
</ng-container>
用打字稿写。
this.dataSource.sortingDataAccessor = (item, property) => {
switch (property) {
case 'select': return this.selection.selected.includes(item);
case 'nestedObject': return item.parentObject.childObject;
default: return item[property];
}
};
基本上,因为当数据传递给 sortingDataAccessor 时我的 matColumnDef 是 'select',您需要检查它是否匹配 'select'。一旦您知道它与 'select' 匹配,您就可以检查您的项目(即当前行)是否包含在所选项目的数组(selection.selected 数组)中。
selection = new SelectionModel(true, []); // you already should have this since you have select.
我还介绍了如何对嵌套对象进行排序。如果你需要它。如果您有嵌套对象,则需要在 switchcase 中编写类似 case 'nestedObject' 的内容。 'nestedObject' 就是您在 table 中对专栏的称呼。
我在我的项目中检查过它,它工作正常。
祝你好运!