css - Angular 垫表 : Is it possible to merge cells by columns?

标签 css angular typescript angular-material angular-material-table

我无法找到有关如何在 mat-table 中合并列单元格的答案。只看到几个使用 when 合并行单元格的例子。所以想知道我是否可以在这里找到答案。

我有这个 JSON 数据:

{
    "id": 4,
    "description": "this is another block",
    "block_size": 3480,
    "lot_count": 5,
    "lots": [
        {
            "id": 17,
            "lot_name": "test 17",
            "status": "SOLD",
            "block_id": 4,
            "lot_id": 1,
            "lot_size": 828
        },
        {
            "id": 18,
            "lot_name": "test 18",
            "status": "OPEN",
            "block_id": 4,
            "lot_id": 2,
            "lot_size": 885
        },
        {
            "id": 19,
            "lot_name": "test 19",
            "status": "SOLD",
            "block_id": 4,
            "lot_id": 3,
            "lot_size": 648
        },
        {
            "id": 20,
            "lot_name": "test 20",
            "status": "OPEN",
            "block_id": 4,
            "lot_id": 4,
            "lot_size": 553
        },
        {
            "id": 21,
            "lot_name": "Test 21",
            "status": "OPEN",
            "block_id": 4,
            "lot_id": 5,
            "lot_size": 566
        }
    ]
}

并且期望 mat-table 中的输出为:

+------------------------------------------------------------------+
| No.        Lot Name    Block    Block Size    Lot Id    Lot Size |
+------------------------------------------------------------------+
| 17         test 17                            1         828      |
| 18         test 18                            2         885      |
| 19         test 19     4        3480          3         648      |
| 20         test 20                            4         553      |
| 21         test 21                            5         566      |
+------------------------------------------------------------------+

如您所见,我想让BlockBlock Size 列中的单元格合并。

最佳答案

与此同时,您可能找到了解决问题的方法,但由于我刚刚创建了以下 StackBlitz,所以我分享它以防其他人寻找相同问题的解决方案。

https://stackblitz.com/edit/angular-gevqvq

The RowSpanComputer class from this solution is based on code found in the open source project Koia. In there, the computed rowspan attributes are used within summary-table.component.html.

更新

上面链接的 StackBlitz 中的代码示例仅适用于乐观情况。理想情况下,不会为表格的最后一列计算行跨度,否则如果行与前一列相同,则不会显示这些行。

ngOnInit() {
  this.columnNames = Object.keys(this.data[0]);
  this.lastColumnName = this.columnNames[this.columnNames.length - 1];
  this.allButLastColumnNames = this.columnNames.slice(0, -1);
  this.rowSpans = this.rowSpanComputer.compute(this.data, this.allButLastColumnNames);
}

在 HTML 模板中也必须考虑到这一点。我们以不同的方式对待前一列和最后一列。

<table mat-table *ngIf="rowSpans" [dataSource]="data" class="mat-elevation-z8">
  <ng-container *ngFor="let columnName of allButLastColumnNames; let iCol = index" [matColumnDef]="columnName">
    <th mat-header-cell *matHeaderCellDef>{{ columnName }}</th>
    <td mat-cell *matCellDef="let row; let iRow = index" [attr.rowspan]="rowSpans[iCol][iRow].span"
       [style.display]="rowSpans[iCol][iRow].span === 0 ? 'none'  : ''">{{ row[columnName] }}</td>
  </ng-container>
  <ng-container [matColumnDef]="lastColumnName">
    <th mat-header-cell *matHeaderCellDef>{{ lastColumnName }}</th>
    <td mat-cell *matCellDef="let row; let iRow = index">{{ row[lastColumnName] }}</td>
  </ng-container>
  <tr mat-header-row *matHeaderRowDef="columnNames"></tr>
  <tr mat-row *matRowDef="let row; columns: columnNames"></tr>
</table>

请看一下这个改进的StackBlitz看看它是如何工作的。

关于css - Angular 垫表 : Is it possible to merge cells by columns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56882758/

相关文章:

html - 在html中并排 float 多个元素

html - 如何将我的图标放在我的 div 的中间和中心?

javascript - Typescript 中的字段变量

typescript - Maybe monad 在 TypeScript 中有何用处?

javascript - 模型绑定(bind)不适用于 Angular2 中的选择

Angular 4.1.3 使用AOT时,服务工厂返回undefined

javascript - Django View 组件没有对齐?

php - 如何在创建 wordpress 主题时包含 css 文件?

image - 我如何在 Angular2 中表示字节数组中的图像/视频?

angular - TypeScript:重用前端(Angular)和后端的接口(interface)和类