【问题标题】:How to display 3 static columns and rest dynamic columns in angular如何以角度显示 3 个静态列和其余动态列
【发布时间】:2020-08-27 18:07:38
【问题描述】:

我在 Angular 中显示一个网格时遇到了一个奇怪的问题,该网格有 3 个静态列,接下来的列可以是任何动态的。

例如 - 我来自后端的数据看起来像 -

{
    "CONNECTOR": "D00425B",
    "PIN": "A03",
    "DESCRIPTION": "DME Source",
    "EFFECTIVITY - VA305": "1",
    "EFFECTIVITY - VA504": "0"
  },
  {
    "CONNECTOR": "D00425B",
    "PIN": "B03",
    "DESCRIPTION": "G/S Source",
    "EFFECTIVITY - VA305": "0",
    "EFFECTIVITY - VA504": "1"
  },

我希望我的 Angular 网格看起来像

Connector      Pin        Description     Effectivity-VA305       Effectivity-VA504

D00425B        A03        DME Source              1                    0

D00425B        B03        G/S Source              0                    1

前三列(连接器、引脚、描述)将始终存在,但其他两列可以变化,可以是 2、3、4 或 n 列。

例如,如果我的数据是 -

{
    "CONNECTOR": "D00425B",
    "PIN": "A03",
    "DESCRIPTION": "DME Source",
    "EFFECTIVITY - VA305": "1",
    "EFFECTIVITY - VA504": "0"
    "EFFECTIVITY - VA385": "1",
  },
  {
    "CONNECTOR": "D00425B",
    "PIN": "B03",
    "DESCRIPTION": "G/S Source",
    "EFFECTIVITY - VA305": "0",
    "EFFECTIVITY - VA504": "1",
    "EFFECTIVITY - VA385": "1",
  },

那么我的网格应该改变为 -

Connector      Pin        Description     Effectivity-VA305   Effectivity-VA504    EFFECTIVITY -VA385

D00425B        A03         DME Source              1                      0               1


D00425B        B03         G/S Source              0                      1               1

我目前正在获取 MatTable 的数据源,例如 -

<mat-table id="hexCodeMatTable" class="paddingTable" [ngStyle]="{ 'width.px': innerWidth }" [dataSource]="gridDataSource" matSort style="overflow: auto;">

列名称为 -

<mat-header-row class="headerHeight" *matHeaderRowDef="columnsToDisplay" ></mat-header-row>
 <mat-row *matRowDef="let row; columns: columnsToDisplay"></mat-row>

无法实现动态列名,请帮忙

【问题讨论】:

  • 如果你改变变量columnsToDisplay mat-table 不会改变? -这是你唯一需要的-
  • @Eliseo - 但是 columnsToDisplay 值会根据用户的输入而改变,这将是动态的。这是我的查询,如何实现
  • 您希望用户如何更改列显示?我使用复选框给出了答案,但我不知道您的要求

标签: javascript html angular typescript


【解决方案1】:

这只是一个变量。你想怎么改变?

如果是使用一系列的复选框,你可以有一些喜欢

<input type="checkBox" [ngModel]="displayedColumns.indexOf('name')>=0"
   (ngModelChange)="change($event,'name')">Name
</label>
  <label>
<input type="checkBox" [ngModel]="displayedColumns.indexOf('weight')>=0"
   (ngModelChange)="change($event,'weight')">Weight
</label>
<label>
<input type="checkBox" [ngModel]="displayedColumns.indexOf('symbol')>=0"
   (ngModelChange)="change($event,'symbol')">Symbol
</label>

在 .ts 中你有

sortedColumns: string[] = ['position', 'name', 'weight', 'symbol']; //<--a duplicate of your displayColumns
change(value:boolean,column:string)
  {
    if (value && this.displayedColumns.indexOf(column)<0)
    {
        this.displayedColumns.push(column);
        this.displayedColumns.sort((a,b)=>this.sortedColumns.indexOf(a)>this.sortedColumns.indexOf(b)?1:-1)
    }
    if (!value && this.displayedColumns.indexOf(column)>=0)
          this.displayedColumns=this.displayedColumns.filter(x=>x!=column)
  }

stackblitz

简要说明。我使用 [ngModel] && (ngModelChange)。是的,您可以使用 [ngModel]="some different a variable"。所以我不需要声明一个额外的变量。在这种情况下,检查显示列(一个数组)是否有一个元素,第一种情况为“名称”,第二种情况为“重量”,最后一种情况为“符号”。

我在 ngModelChange 中使用相同的函数。如果 che 复选框被选中,请查看 $event 是 true 还是 false。但我传递了一个附加参数,即我们可以隐藏/显示的列的名称。

【讨论】:

  • 不,这不是我的查询。我想你理解错了。总之谢谢你
  • 好吧,我想我知道你想要什么。由于所有数据的表都相同,因此您必须创建包含所有可能列的表。然后,当你收到数据时(在订阅中),根据你收到的数据更改变量“this.columnsToDisplay”,我想你可以简单地写:this.columnsToDisplay=Object.keys(result[0])
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 2018-01-03
  • 2017-01-19
  • 2018-04-21
  • 2018-06-18
相关资源
最近更新 更多