Reputation: 2141
I'm trying to implement a footer row into a mat-table component after recently upgrading to angular 6 for this purpose, but after adding both the mat-footer-cell and mat-footer-row elements in the table, I get the following error:
ERROR TypeError: Cannot read property 'template' of undefined at MatFooterRowDef.push../node_modules/@angular/cdk/esm5/table.es5.js.CdkFooterRowDef.extractCellTemplate (vendor.js:17400)
The table still appears on the page, but with no data, no footer row, and a T symbol where to the right of each column heading.
HTML:
<ng-container matColumnDef="total">
<mat-header-cell *matHeaderCellDef mat-sort-header style="width: 15%; flex: none">Total</mat-header-cell>
<mat-cell *matCellDef="let item" style="width: 15%; flex: none">{{item.total | currency: 'GBP'}}</mat-cell>
<td mat-footer-cell *matFooterCellDef>100</td>
</ng-container>
<mat-header-row *matHeaderRowDef="tableColumns"></mat-header-row>
<mat-row *matRowDef="let row; columns: tableColumns" (click)="editItem(row)"></mat-row>
<tr mat-footer-row *matFooterRowDef="tableColumns"></tr>
</mat-table>
Upvotes: 30
Views: 22396
Reputation: 6007
For new comes, you need a foot in each column from your table:
<table mat-table [dataSource]="dataSource" class="mat-elevation-z8 demo-table">
<!-- Name Column -->
<ng-container matColumnDef="name">
<th mat-header-cell *matHeaderCellDef> Nome </th>
<td mat-cell *matCellDef="let element"> {{element.name}} </td>
<td mat-footer-cell *matFooterCellDef> Total </td>
</ng-container>
<!-- age Column -->
<ng-container matColumnDef="age">
<th mat-header-cell *matHeaderCellDef> Age </th>
<td mat-cell *matCellDef="let element"> {{element.age}} </td>
<td mat-footer-cell *matFooterCellDef> {{your information}} </td>
</ng-container>
...
<tr mat-footer-row *matFooterRowDef="displayedColumns; sticky: true"></tr>
</table>
Upvotes: 2
Reputation: 907
Need to include mat-footer-cell for each column:
<div class="example-container mat-elevation-z8">
<mat-table #table [dataSource]="dataSource">
<mat-header-row *matHeaderRowDef="displayedColumns; sticky: true"></mat-header-row>
<mat-row *matRowDef="let row; columns: displayedColumns;"></mat-row>
<ng-container matColumnDef="categoryName">
<mat-header-cell *matHeaderCellDef> First Name </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.firstName}} </mat-cell>
//This is the part for which the code is breaking
<mat-footer-cell *matFooterCellDef> Your footer column Name will goes here </mat-footer-cell>**
</ng-container>
<ng-container matColumnDef="categoryName">
<mat-header-cell *matHeaderCellDef> Last Name </mat-header-cell>
<mat-cell *matCellDef="let row"> {{row.lastName}} </mat-cell>
//This need to be included in all your columns
<mat-footer-cell *matFooterCellDef> Your 2nd footer column Name will goes here </mat-footer-cell>**
</ng-container>
<mat-footer-row *matFooterRowDef="displayedColumns; sticky: true"></mat-footer-row>
</mat-table>
</div>
Upvotes: 8
Reputation: 91
You can define your own "tableFooterColumns" variable.
tableFooterColumns: string[] = ['total'];
and use it in the template (change "colspan" for your needs):
<tr mat-footer-row *matFooterRowDef="tableFooterColumns" colspan="2"></tr>
Upvotes: 9
Reputation: 2141
FIXED: This was not made clear in the material documentation, but all columns must contain a <mat-footer-cell/>
element, even if only one column will contain content.
Upvotes: 81