使Angular mat-table中的行数长于dataSource的长度

Posted

技术标签:

【中文标题】使Angular mat-table中的行数长于dataSource的长度【英文标题】:Making the number of rows in Angular mat-table longer than the length of dataSource 【发布时间】:2021-07-11 14:55:36 【问题描述】:

是否有可能有一个 ma​​t-table 输出的数据行数超过所提供数据源的长度?以此类数据为例:

people: [
    
      name: "John", 
      birthday: "01.01.2000", 
      hobbies: [
            type: "Golf", level: "Intermediate",
            type: "Bowling", level: "Noob" ,
            type: "Programming", level: "Beginner"
      ]
   ,
    
      name: "Linda", 
      birthday: "21.12.2001", 
      hobbies: [
            type: "Hockey", level: "Elite",
            type: "Dart", level: "Noob" ,
            type: "Programming", level: "Intermediate"
      ]
   

]

我使用 people 列表作为 mat-table 的数据源(即长度 2),但我想生成这样的表格:

Name Birthday Hobby Level
John 01.01.2000 Golf Intermediate
John 01.01.2000 Bowling Noob
John 01.01.2000 Programming Beginner
Linda 21.12.2001 Hockey Elite
Linda 21.12.2001 Dart Noob
Linda 21.12.2001 Programming Intermediate

目前得到的代码是这样的(虽然提供的数据只是示例数据):

<mat-table [dataSource]="dataSource">
   <ng-container mathColumnDef="name">
      <mat-header-cell *matHeaderCell> Name </mat-header-cell>
      <mat-cell *matCellDef="let col"> col.name </mat-cell>
   </ng-container>
   <ng-container mathColumnDef="birthday">
      <mat-header-cell *matHeaderCell> Birthday </mat-header-cell>
      <mat-cell *matCellDef="let col"> col.birthday </mat-cell>
   </ng-container>

   // the next two columns is where the problem lies. 
   // I only getting the first hobby in list to have a valid code.
   <ng-container mathColumnDef="hobby">
      <mat-header-cell *matHeaderCell> Hobby </mat-header-cell>
      <mat-cell *matCellDef="let col"> col.hobbies[0].type </mat-cell> 
   </ng-container>
   <ng-container mathColumnDef="level">
      <mat-header-cell *matHeaderCell> Level </mat-header-cell>
      <mat-cell *matCellDef="let col"> col.hobbies[0].level </mat-cell> 
   </ng-container>
   <mat-header-row *matHeaderRowDef="['name', 'birthday', 'hobby', 'level']">
   <mat-row *matRowDef="let row; columns: ['name', 'birthday', 'hobby', 'level']"></mat-row>
</mat-table>

其中 dataSource 是人员列表。此外,爱好列表可以有不同的长度。

我试过了:

在 mat-cell 上添加 *ngFor 指令,但不允许在同一元素上使用两个结构指令

我还在 mat-cell 元素内的 ng-container 上尝试了 *ngFor 指令,如下所示:

  <mat-cell *matCellDef="let col">
     <div>
        <ng-container *ngFor="let item of col.hobbies">
            item.type 
        </ng-container>
     </div>
  </mat-cell>

但这并没有创建想要的结果,即爱好列表中每个元素的新表行。

有没有人可以解决这个问题?也许不需要在包含所有爱好的组件中创建一个新列表作为新列表项(即约翰的姓名和生日有 3 个重复项,琳达的姓名和生日有 3 个重复项)。

感谢我能得到的所有帮助

【问题讨论】:

也许这可能会有所帮助***.com/questions/54293513/… 【参考方案1】:

您可以使用@iamentaafaz 的建议,它提供了一个材质可折叠的表格显示。

但是如果你想在问题中使用确切的类型,你可能需要折射datasource

对于 ts

import  Component, OnInit  from "@angular/core";

export interface TableData 
  name: any;
  birthday: any;
  type: any;
  level: any;


@Component(
  selector: "table-basic-example",
  styleUrls: ["table-basic-example.css"],
  templateUrl: "table-basic-example.html"
)
export class TableBasicExample implements OnInit 
  displayedColumns: string[] = ["name", "birthday", "type", "level"];
  dataSource: any = [];

  people = [
    
      name: "John",
      birthday: "01.01.2000",
      hobbies: [
         type: "Golf", level: "Intermediate" ,
         type: "Bowling", level: "Noob" ,
         type: "Programming", level: "Beginner" 
      ]
    ,
    
      name: "Linda",
      birthday: "21.12.2001",
      hobbies: [
         type: "Hockey", level: "Elite" ,
         type: "Dart", level: "Noob" ,
         type: "Programming", level: "Intermediate" 
      ]
    
  ];
  destructuredPersonData: any[] = [];

  ngOnInit() 
    const destructuredPersonData = this.refractorPeopleData(this.people);
    this.dataSource = destructuredPersonData;
  

  private refractorPeopleData(data: any[]) 
    let result: TableData[] = [];
    data.forEach(person => 
      const name = person.name;
      const birthday = person.birthday;
      person.hobbies.forEach((hobby:  type: any; level: any ) => 
        if (hobby) 
          const type = hobby.type;
          const level = hobby.level;
          result.push(
            name,
            birthday,
            type,
            level
          );
        
      );
    );
    return result;
  

你可以在这里看到演示https://angular-k5ps1y.stackblitz.io

【讨论】:

以上是关于使Angular mat-table中的行数长于dataSource的长度的主要内容,如果未能解决你的问题,请参考以下文章

Angular Material mat 表合并的行

如何避免使用角度材料从角度 2 中的 mat-table 传输相同的行

在 mat-table 的 mat-cell 内实现 if else 条件 - Angular 5

如何使用angular2中的mat-input来汇总在mat-table列中输入的值

如何使 Mat-Table 中的列值成为超链接 [重复]

有啥方法可以在 Angular 材料中使用 mat-table 编辑特定的表格列