我建议在将数据用作数据源之前,将数据转换为包含报告卡及其报告的平面数组。对于您的具体情况,这将是最简单且最容易理解的。
@Component({
selector: 'table-basic-example',
styleUrls: ['table-basic-example.css'],
templateUrl: 'table-basic-example.html',
})
export class TableBasicExample implements OnInit {
private reportCards = REPORT_DATA;
public reportCardColumns: string[] = ['reportCard.student'];
public reportColumns: string[] = ['report.class', 'report.grade', 'report.teacher'];
public dataSource: Array<ReportCard|Report>;
public ngOnInit(): void {
const data: Array<ReportCard|Report> = [];
for (let reportCard of REPORT_DATA) {
data.push(reportCard, ...reportCard.reports);
}
this.dataSource = data;
}
public isReportCard(index: number, data: ReportCard|Report): boolean {
return Reflect.has(data, 'reports');
}
public isReport(index: number, data: ReportCard|Report): boolean {
return !Reflect.has(data, 'reports');
}
}
在您的模板中,您现在可以简单地使用两个 when 谓词及其自己的列和 css 类:
<tr mat-header-row *matHeaderRowDef="reportColumns" ></tr>
<tr mat-row *matRowDef="let row; columns: reportCardColumns; when: isReportCard" class="reportCard"></tr>
<tr mat-row *matRowDef="let row; columns: reportColumns; when: isReport" class="report"></tr>
你可以找到这里有一个正在运行的 StackBlitz https://stackblitz.com/edit/angular-ibcmee-u3wxjp?file=src/app/table-basic-example.ts.
Update:
补充意见后这是另一个 Stackblitz https://stackblitz.com/edit/angular-ibcmee-3a2oux?file=src/app/table-basic-example.ts这正是原始问题中所要求的。