如何在Angular material6table中使用colspan和ngFor?
How to use colspan and ngFor in Angular material 6 table?
我正在使用 Angular Material 渲染 table。
代码:
<ng-container matColumnDef="type">
<th mat-header-cell *matHeaderCellDef> Workout type </th>
<td mat-cell *matCellDef="let workout"> {{workout.type}} </td>
</ng-container>
<ng-container matColumnDef="set1">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[0].weight}} x {{workoutData.workoutSessions[0].sets[0].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set2">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[1].weight}} x {{workoutData.workoutSessions[0].sets[1].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set3">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[2].weight}} x {{workoutData.workoutSessions[0].sets[2].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set4">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[3].weight}} x {{workoutData.workoutSessions[0].sets[3].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set5">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[4].weight}} x {{workoutData.workoutSessions[0].sets[4].repetitions}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="workoutTableColumns"></tr>
<tr mat-row *matRowDef="let row; columns: workoutTableColumns;"></tr>
我有两个问题:
1) 在这种情况下是否可以使用 *ngFor 遍历数组?现在我的代码看起来太乱了,想清理一下。
2) 是否可以使用colspan?我没有找到任何有关此问题已解决的信息(问题:https://github.com/angular/material2/issues/5888)。
因此,主要问题是:在这种特定情况下,使用 Angular material table 还是常规的更好?
我看不出您不能执行以下操作的原因:
<ng-container *ngFor="let set of workoutData.workoutSessions[0].sets; let i = index" [matColumnDef]="'set' + i">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let set"> {{set.weight}} x {{set.repetitions}} </td>
</ng-container>
大部分是不言自明的,主要变化是把matColumnDef="setX"
改成[matColumnDef]="'set' + i"
。通过添加方括号,它会导致将值评估为字符串,而不仅仅是读取 'as is'.
我知道这是一个老问题,但对于你的第二个问题,是的,你可以在 matTable 中使用 colspan。这是 mat-header-cell 的示例代码:-
<ng-container matColumnDef="set5">
<th mat-header-cell *matHeaderCellDef colspan="3"> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData">
{{workoutData.workoutSessions[0].sets[4].weight}} x
{{workoutData.workoutSessions[0].sets[4].repetitions}} </td>
</ng-container>
我不喜欢接受的答案,因为它提出了一些解决方法。其实colspan就是attr。因此,您可以使用 [attr.colspan]
添加 colspan,例如 [attr.colspan]="columns.length"
<ng-container matColumnDef="demo">
<th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let item" [attr.colspan]="columns.length - 1">...</td>
</ng-container>
我正在使用 Angular Material 渲染 table。
代码:
<ng-container matColumnDef="type">
<th mat-header-cell *matHeaderCellDef> Workout type </th>
<td mat-cell *matCellDef="let workout"> {{workout.type}} </td>
</ng-container>
<ng-container matColumnDef="set1">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[0].weight}} x {{workoutData.workoutSessions[0].sets[0].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set2">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[1].weight}} x {{workoutData.workoutSessions[0].sets[1].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set3">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[2].weight}} x {{workoutData.workoutSessions[0].sets[2].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set4">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[3].weight}} x {{workoutData.workoutSessions[0].sets[3].repetitions}} </td>
</ng-container>
<ng-container matColumnDef="set5">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData"> {{workoutData.workoutSessions[0].sets[4].weight}} x {{workoutData.workoutSessions[0].sets[4].repetitions}} </td>
</ng-container>
<tr mat-header-row *matHeaderRowDef="workoutTableColumns"></tr>
<tr mat-row *matRowDef="let row; columns: workoutTableColumns;"></tr>
我有两个问题:
1) 在这种情况下是否可以使用 *ngFor 遍历数组?现在我的代码看起来太乱了,想清理一下。
2) 是否可以使用colspan?我没有找到任何有关此问题已解决的信息(问题:https://github.com/angular/material2/issues/5888)。
因此,主要问题是:在这种特定情况下,使用 Angular material table 还是常规的更好?
我看不出您不能执行以下操作的原因:
<ng-container *ngFor="let set of workoutData.workoutSessions[0].sets; let i = index" [matColumnDef]="'set' + i">
<th mat-header-cell *matHeaderCellDef> Weight x Reps </th>
<td mat-cell *matCellDef="let set"> {{set.weight}} x {{set.repetitions}} </td>
</ng-container>
大部分是不言自明的,主要变化是把matColumnDef="setX"
改成[matColumnDef]="'set' + i"
。通过添加方括号,它会导致将值评估为字符串,而不仅仅是读取 'as is'.
我知道这是一个老问题,但对于你的第二个问题,是的,你可以在 matTable 中使用 colspan。这是 mat-header-cell 的示例代码:-
<ng-container matColumnDef="set5">
<th mat-header-cell *matHeaderCellDef colspan="3"> Weight x Reps </th>
<td mat-cell *matCellDef="let workoutData">
{{workoutData.workoutSessions[0].sets[4].weight}} x
{{workoutData.workoutSessions[0].sets[4].repetitions}} </td>
</ng-container>
我不喜欢接受的答案,因为它提出了一些解决方法。其实colspan就是attr。因此,您可以使用 [attr.colspan]
添加 colspan,例如 [attr.colspan]="columns.length"
<ng-container matColumnDef="demo">
<th mat-header-cell *matHeaderCellDef></th>
<td mat-cell *matCellDef="let item" [attr.colspan]="columns.length - 1">...</td>
</ng-container>