【问题标题】:create dynamic mat-table like math matrix with angular material使用角材料创建动态垫表,如数学矩阵
【发布时间】:2019-12-07 07:41:37
【问题描述】:

我在创建表时遇到了一个问题。我的结构数据是动态的,这意味着行数和列数是可变的,如矩阵m*n。结构在here 上可用。

我想向 ma​​t-table 显示 json (above photo)。但我无法正确地将数据分配给表格,并且它在 table.show column0 上显示所有 mat- 行的重复数据表。

虽然表中的正确数据应该是

我的代码在stackblitz 上可用。

在这段代码中,我想用5 col 和6 row 创建表。

我怎样才能解决它并在此表中显示所有数据?

【问题讨论】:

    标签: angular angular-material angular8 mat-table


    【解决方案1】:

    当你有一个矩阵时,你有一个 FormArray 的 FormArrays,例如如果您有类似的数据

    export const data=[['uno','one'],['dos','two'],['tres','three']]
    

    您可以像 (**) 一样格式化 FormArray 的 formArray

      myformArray = new FormArray(
            data.map(row=>new FormArray(
                row.map(x=>new FormControl(x))
      )))
    

    当您使用 mat 表时,您需要一个“displayedColumns”,即一个包含您要显示的列的数组。如果你想要一个按钮“删除”,你可以使用另一个变量更多

      displayedHeads: string[] = data[0].map((x,index)=>'col'+index);
      displayedColumns: string[] = this.displayedHeads.concat('delete')
    

    好吧,快准备好了,我添加了一个新变量 more 来指示您拥有的列数 - 这允许我们添加新行 - 以及使用 viewChild 的表格

      columns: number = data[0].length;
      @ViewChild(MatTable, { static: true }) table: MatTable<any>; 
    

    我们的桌子已经准备好展示了:

    <button mat-button (click)="add()">Add row</button>
    <table mat-table [dataSource]="myformArray.controls" class="mat-elevation-z8">
      <!-- Name Column -->
      <ng-container *ngFor="let head of displayedHeads;let j=index" [matColumnDef]="head">
        <th mat-header-cell *matHeaderCellDef> {{head}} </th>
        <td mat-cell *matCellDef="let element">
          <input [formControl]="element.at(j)">
        </td>
      </ng-container>
    
      <ng-container matColumnDef="delete">
        <th mat-header-cell *matHeaderCellDef></th>
        <td mat-cell *matCellDef="let element;let i=index;">
          <button mat-button (click)="delete(i)">delete</button>
        </td>
      </ng-container>
    
      <tr mat-header-row *matHeaderRowDef="displayedColumns"></tr>
      <tr mat-row *matRowDef="let row; columns: displayedColumns;"></tr>
    </table>
    

    看到dataSource是myformArray.controls,输入是[formControl]="element.at(j),是的“元素是内部formArray”

    你可以看stackblitz(*)中的例子

    我添加了两个函数来添加和删除行

      delete(index: number) {
        this.myformArray.removeAt(index);
        this.table.renderRows()
    
      }
      add() {
        const empty = [];
        for (let i = 0; i < this.columns; i++)
          empty.push(true)
    
        this.myformArray.push(
          new FormArray(empty.map(x => new FormControl('')))
        )
        this.table.renderRows()
    
      }
    

    (*) 在 stackblitz 中,我添加了一个指令以允许使用箭头键跨单元格移动

    (**) 在您的情况下,您将表单格式设置为

    myformArray = new FormArray(
            data.map(row=>new FormArray(
                row.map(x=>new FormControl(x.c))
      )))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2020-12-17
      • 2020-04-20
      • 1970-01-01
      • 2020-11-19
      • 2020-11-08
      • 2019-11-26
      相关资源
      最近更新 更多