使用rowspan动态渲染数据

时间:2019-08-01 12:56:18

标签: javascript html angular html-table

我正在尝试在angular项目中使用 ngFor rowspan 渲染表格,这是我的数据:

 list = [
    {
      name: "app1",
      templates:[
        { name: "temp1", version: 1}
      ]
    },
        {
      name: "app2",
      templates:[
        { name: "temp1", version: 1},
        { name: "temp1", version: 2},
        { name: "temp1", version: 3}
      ]
    },
        {
      name: "app3",
      templates:[
        { name: "temp1", version: 1},
         { name: "temp1", version: 2}
      ]
    }
  ]

我想像这样动态渲染数据

enter image description here

谢谢

5 个答案:

答案 0 :(得分:2)

您可以使用以下逻辑:

<table style="border: 1px solid black">
    <tr>
        <th>Application</th>
        <th>Version</th>
    </tr>
    <tr *ngFor="let obj of list">
        <td style="border: 1px solid black">{{obj.name}}</td>
        <td>
            <div *ngFor="let entry of obj.templates" style="border: 1px solid black; padding: 2px; margin: 2px">
                {{entry.version}}
            </div>
        </td>
    </tr>
</table>

这是同样适用的stackblitz

答案 1 :(得分:2)

一个简单的方法,就像这样

<table style="border: 1px solid black">
  <tr>
     <th>Application</th>
     <th>Version</th>
  </tr>
  <ng-container *ngFor="let obj of list">
      <tr *ngFor="let entry of obj.templates;let i = index">
          <td [attr.rowspan]="obj.templates.length" *ngIf="i == 0">{{obj.name}}</td>
          <td>{{entry.version}}</td>
      </tr>
  </ng-container>
</table>

答案 2 :(得分:1)

您正在寻找做这样的事情。

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

您只需要应用样式即可。

<table>
  <tr>
    <th>Application</th>
    <th>Version</th>
  </tr>
  <tr *ngFor="let listItem of list">
    <td style="vertical-align: top; border: 1px solid black">{{listItem.name}}</td>
    <td>
      <div *ngFor="let template of listItem.templates" style="border: 1px solid black">
        {{template.version}}
      </div>
    </td>
  <tr>
</table>

答案 3 :(得分:1)

尝试一下:

foreach($images as $image) {                
   $xpl = explode('_', $image); 
   $newName = end($xpl);
}  

答案 4 :(得分:1)

这只是另一个替代答案,反而会使模板逻辑更难,我只是使用reduce来将数据映射到正确的结构。

组件

  tableData = []

  ngOnInit() {
      this.tableData = this.list.reduce((result,data) =>{
        const appName=data.name;
        const [first , ...items] = data.templates;

        result.push({appName ,rowSpan : data.templates.length ,version: first.version});
        result.push(...items.map(item=> ({version :item.version})));

        return result;
      },[]) 
  }

模板

<table>
    <tr>
        <th>Application</th>
        <th>Version</th>
    </tr>

    <tr *ngFor="let data of tableData">
        <td *ngIf="data.rowSpan" [rowSpan]="data.rowSpan">{{data.appName}}</td>
        <td>{{data.version}}</td>
    </tr>

</table>

demo ??