typescript - Angular material tabulka součty v patičce
Používám Angular Material Table 8.2.3. Mám spoustu tabulek, které jsou generovány podle definice v TypeScriptu. Většina tabulek se týká čísel, takže musím zobrazovat součty v patičce. Problém je v tom, že příklady materiálových tabulek na stránce Material mají pouze jeden sloupec a nezobrazují, jak pracovat s více sloupci. Hledám způsob, jak dynamicky vypočítat součet sloupce. Mám následující kód, ale nespouští se:
<table mat-table [dataSource]="dataSource" matSort matSortActive="Date" matSortDisableClear="true">
<ng-container *ngFor="let column of columns" [matColumnDef]="column.columnDef">
<th mat-header-cell *matHeaderCellDef mat-sort-header>{{ column.header }}</th>
<td mat-cell *matCellDef="let row">{{ column.cell(row) }}</td>
<td mat-footer-cell *matFooterCellDef> {{this.dataSource.data.reduce((data, val) => data+= val.cell(row), 0) </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
<tr mat-footer-row *matFooterRowDef="displayedColumns"></tr>
</table>
Odpověď č. 1
Nezapisujete správně syntaxi interpolace string.
Váš kód postrádá ukončení }}
Zde je opravená šablona:
<table
mat-table
[dataSource]="dataSource"
matSort
matSortActive="Date"
matSortDisableClear="true">
<ng-container
*ngFor="let column of columns"
[matColumnDef]="column.columnDef">
<th
mat-header-cell
*matHeaderCellDef
mat-sort-header>
{{ column.header }}
</th>
<td
mat-cell
*matCellDef="let row">
{{ column.cell(row) }}
</td>
<td
mat-footer-cell
*matFooterCellDef>
{{ dataSource.data.reduce((data, val) => data+= val.cell(row), 0) }}
</td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
<tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
<tr mat-footer-row *matFooterRowDef="displayedColumns"></tr>
</table>
A pak budete pravděpodobně muset udělat dataSource veřejným, aby byl přístupný v šabloně.
Ale vzhledem k tomu, že dataSource je pravděpodobně nějaký druh závislosti, kterou máte ve svém komponentu, je lepší mít veřejně vystavenou pouze vlastnost data.
Takže byste mohli chtít vytvořit vlastnost, která vypadá nějak takto:
data = this.dataSource.data.reduce((datum, val) => datum+= val.cell(row), 0);
A pak tam, kde interpolujete výsledek, byste udělali toto:
<td
mat-footer-cell
*matFooterCellDef>
{{ data }}
</td>
PS - Volání metod v syntaxi datového vázání může stát hodně výkonu, a proto by se s tím mělo zacházet jen ve výjimečných případech.
Odkazujte se na tento vlákno, pokud chcete vědět více o důsledcích volání metod v syntaxi vazby dat:
Výkon Angularu: Událost DOM způsobuje nepotřebné volání funkcí
Odpověď č. 2
Myslím, že ve vašem příkladu jste zapomněli uzavřít {{ v <td mat-footer-cell *matFooterCellDef> {{this.dataSource.data.reduce((data, val) => data+= val.cell(row), 0) </td>
Můžete zavolat funkci z šablony a tam vypočítat součet sloupce. Například:
<td mat-footer-cell *matFooterCellDef> {{calculateSum()}} </td>
v souboru .ts:
calculate() {
// calucating
return value;
}
