select mat-table row programmatically
我的应用程序中有一个基于 mat-table 的组件,它允许用户通过单击来选择一行。根据选定的表格行,代码会在相邻的扩展面板中显示有关该行的其他信息/详细信息。当页面加载时,没有选择任何表格行 - 因此详细信息面板为空。以编程方式选择表格行(比如说第一个)的最佳方法是什么?
当前行选择基于在被单击的 mat-row 上调用单击处理程序,该处理程序将属性 \\'selectedRowIndex\\' 设置为 row.id 字段。这会导致该行的 ngClass 绑定到突出显示的 css 类:
1 2 | <mat-header-row *matHeaderRowDef="displayedColumns"></mat-header-row> <mat-row *matRowDef="let row; columns: displayedColumns;" [ngClass]="{'highlight': selectedRowIndex == row.id}" (click)="highlight(row)"></mat-row> |
但是,如果我想要第一行的"默认"选择,我将如何实现呢?我认为这对于许多开发人员来说应该是一个非常标准的用例。
您也可以使用
我在 Stackblitz 上创建了一个演示。我希望这会对您/其他人有所帮助/指导。
Component.html
1 | <tr mat-row *matRowDef="let row; columns: displayedColumns;" (click)="highlight(row)" [ngClass]="{'highlightTableColor': selectedRowIndex == row.position}"></tr> |
Component.ts
1 2 3 | highlight(row){ this.selectedRowIndex=row.position; } |
花了很长时间才找到一个可行的答案,所以会尽量简洁。在我的情况下,我通过一个 http 请求,所以通过一个可观察的但是
在
上的 mat-row 上声明一个
1 2 3 | <mat-row *matRowDef="let row; columns: displayedColumnsArray" (click)="onRowClicked(row)" [ngClass]="{ 'selected' : row === currentEntity }">Content</mat-row> |
在
1 2 3 4 | onRowClicked(row: any) { this.logger.debug('-----> Row clicked', row); this.currentEntity = Company.fromAny(row); } |
终于在
1 2 3 4 5 | ngOnInit() { // Some things let retreivedData = myWebService.getSomeData() onRowClicked(retreivedData) } |
所以路径是
添加正式答案:
在表格上添加一个 cdkObserveContent 处理程序(这允许表格首先加载):
1 | <mat-table #table [dataSource]="dataSourceTable" matSort aria-label="Faults" (cdkObserveContent)="tableContentChanged()"> |
并在该处理程序中调用突出显示处理程序以突出显示该行:
1 2 3 4 5 | tableContentChanged() { this.zone.run(() => { this.highlight(this.dataSourceTable.data[0]); }); } |