<mat-header-row class="sticky-header" *matHeaderRowDef="['player', 'team', 'goals']"></mat-header-row>
<mat-row *matRowDef="let row; columns: ['player', 'team', 'goals']"></mat-row>
<mat-row class="sticky-footer" *matRowDef="let row: columns: ['total']; when:isLastRow"></mat-row>
...
export class AppComponent {
dataSource: PlayerDataSource;
isLastRow = (data, index) => index === this.players.length;
players = STATS.slice();
constructor() {
this.dataSource = new PlayerDataSource();
this.dataSource.use(this.players.slice());
}
}
阅读此github topic后,我创建了this stackblitz示例,但总和未显示在页脚中。
有人可以阐明这个问题吗?没有关于此的示例。谢谢。
答案 0 :(得分:0)
angular material documentation中有说明,examples中有示例。
您需要做的是以与在每一列中的页眉相同的方式定义页脚单元。在页脚列的列绑定中,直接定义如何计算总和。无需在总数据中添加另一行。之后,您只需添加页脚行定义即可,一切正常。
这是示例中更改后的模板:
<mat-table [dataSource]="dataSource">
<!-- Columns -->
<ng-container matColumnDef="player">
<mat-header-cell *matHeaderCellDef> Player </mat-header-cell>
<mat-cell *matCellDef="let player"> {{ player.name }}</mat-cell>
<mat-footer-cell *matFooterCellDef></mat-footer-cell>
</ng-container>
<ng-container matColumnDef="team">
<mat-header-cell *matHeaderCellDef> Team </mat-header-cell>
<mat-cell *matCellDef="let player"> {{ player.team }}</mat-cell>
<mat-footer-cell *matFooterCellDef></mat-footer-cell>
</ng-container>
<ng-container matColumnDef="goals">
<mat-header-cell class="right-align" *matHeaderCellDef> Goals </mat-header-cell>
<mat-cell class="right-align" *matCellDef="let player"> {{ player.goals }}</mat-cell>
<mat-footer-cell *matFooterCellDef> Total: {{ calculateTotal() }}</mat-footer-cell>
</ng-container>
<!-- Rows -->
<mat-header-row class="sticky-header" *matHeaderRowDef="['player', 'team', 'goals']"></mat-header-row>
<mat-row *matRowDef="let row; columns: ['player', 'team', 'goals']"></mat-row>
<mat-footer-row class="sticky-footer" *matFooterRowDef="['player', 'team', 'goals']"></mat-footer-row>
</mat-table>
以及更改后的组件代码,因此您无需修改数据。
export class AppComponent {
dataSource: PlayerDataSource;
isLastRow = (data, index) => index === this.players.length;
players = STATS.slice();
constructor() {
this.dataSource = new PlayerDataSource();
this.dataSource.use(this.players.slice());
}
public calculateTotal() {
return this.players.reduce((accum, curr) => accum + curr.goals, 0);
}
}
export class PlayerDataSource extends DataSource<PlayerOrTotal> {
dataWithTotal = new BehaviorSubject<PlayerOrTotal[]>([]);
use(players: Player[]) {
this.dataWithTotal.next([ ...players]);
}
connect(): Observable<PlayerOrTotal[]> {
return this.dataWithTotal.asObservable();
}
disconnect() {}
}
我还为您的StackBlitz创建了一个分支,您可以在其中看到它的工作状态。