有没有办法使用更复杂的对象数据源在列上而不是在行上创建 Angular 动态材料表?

问题描述

我想构建一个表格,其中每一列都是来自 API 调用的响应并包含一些元素。我尝试了材料表的不同方法,但似乎没有任何效果。问题来自这样一个事实,即我尝试在列上而不是在行上构建它(每个列上有不同数量的元素)

我也试过一个简单的表格,它可以工作,但是视图看起来不应该。每列都包含在 <ng-container> 中,它应该显示一个新列,但它会在同一列中显示它们。 我也尝试了一种使用 div 的方法效果很好,但是当我向下滚动时,我无法使表格的标题变得粘滞和固定。 (另外,在表格中使用 div 也不是一个好主意) 这是我的表格现在的样子,是目前最好的变体:

 <table class="mat-table">
      <ng-container *ngFor="let elem of selectedCheckValues">
        <th class="mat-header-cell">{{ elem.name }}</th>
        <tr id="{{element}}" *ngFor="let element of elem.items; let idx=index;" (click)="onRowClick(elem,element)">
          <td class="mat-cell">{{element}}</td>
        </tr>
      </ng-container>
    </table>

这就是我的数据的样子:

export interface SelectedCheckValues {
  name: string;
  items: string[];
}

其中 name 应该是表格标题,items 应该是列中的元素。

解决方法

如果您想在 mat-table 的列中分配一系列调用,您需要使用这些列“创建”一个数据源。

我做了一个简单的例子。在这里,我想您使用 forkJoin 获取数据,因此您可以拥有类似

var claimsPrincipal = new ClaimsPrincipal(new ClaimsIdentity(Enumerable.Empty<Claim>()));
var signInManager = A.Fake<SignInManager<User>>();
A.CallTo(() => signInManager.IsSignedIn(claimsPrincipal)).Returns(false);
...
A.CallTo(() => _signInManager.SignOutAsync()).MustHaveHappened();

还有一个 .html

  dataSource:any[] = [];
  data=[0,1,2]
  headers:string[]=[]
  constructor(private dataService:DataService){}
  ngOnInit(){

    //we make a "typical" forkJoin where transform the "data" in an
    //array of "Observables" and use forkJoin
    forkJoin(this.data.map(x=>this.dataService.getData(x)))
    .subscribe((res:any[])=>{
       //when we has the response we "formed" the dataSource
       let i=0;
       let goon=true;
       this.headers=res.map(x=>x.name)
       while(goon)
       {
          const items=res.map(x=>x.items[i])
          goon=items.find(x=>x!==null)
          this.dataSource.push(items)
          i++;
       }
    })
  }

stackblitz

顺便说一句,带有粘性的垫子表只有 .css,因此您可以采用使用普通表和 .css 来粘贴“标题”的方法

更新:我很难想象你是如何获取数据的,如果你通过三个调用一个 api 来获取数据

<table mat-table [dataSource]="dataSource" class="mat-elevation-z8">

  <ng-container *ngFor="let header of headers;let i=index" [matColumnDef]="header">
    <th mat-header-cell *matHeaderCellDef>{{header}}</th>
    <td mat-cell *matCellDef="let element"> {{element[i]}} </td>
  </ng-container>


  <tr mat-header-row *matHeaderRowDef="headers"></tr>
  <tr mat-row *matRowDef="let row; columns: headers;"></tr>
</table>

并且所有的 api 都返回相同数量的元素,想法是使用三个调用的 forJoin 并映射到一个对象数组

getMFTNO() //return some like [101,102,103]
getDF_RESULT() //return some like ["DL","FM","FT"]
getPERSNO() //return some like [0,000000,0000001]

注意:我更新了stackblitz以考虑到这一点

,

从我的桌子上剪下它的样子。

enter image description here

代替

enter image description here

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...