web-dev-qa-db-fra.com

Angular utilisant ngFor

Je voudrais savoir s'il est possible de créer une table HTML dynamique à partir de données JSON. Le nombre de colonnes et d'en-têtes doit changer en fonction des clés du JSON. Par exemple, ce JSON devrait créer cette table:

{
     color: "green", code: "#JSH810"
 }

 ,
 {
     color: "red", code: "#HF59LD"
 }

 ...

enter image description here

Et ce JSON devrait créer cette table:

{
    id: "1", type: "bus", make: "VW", color: "white"
}

,
{
    id: "2", type: "taxi", make: "BMW", color: "blue"
}

...

enter image description here

Cependant, cela doit être 100% dynamique, car je veux afficher des centaines d'objets JSON différents, donc rien ne devrait être codé en dur dans la page HTML.

6
Frank

Si vous souhaitez obtenir la clé de votre objet en tant que tête de votre table, vous devez créer un pipe personnalisé .

import { PipeTransform, Pipe } from '@angular/core';

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    let keys = [];
    for (let key in value) {
      keys.Push(key);
    }
    return keys;
  }
}

Mise à jour: Ou renvoyez simplement les clés en utilisant Object.keys () . ( démo )

@Pipe({name: 'keys'})
export class KeysPipe implements PipeTransform {
  transform(value, args:string[]) : any {
    return Object.keys(value);
  }
}

Maintenant dans votre modèle html:

<table>
  <thead>
    <tr>           
      <th *ngFor="let head of items[0] | keys">{{head}}</th>
    </tr>
  </thead>
  <tbody>
    <tr *ngFor="let item of items">           
      <td *ngFor="let list of item | keys">{{item[list]}}</td>
    </tr>
  </tbody>
</table>

Mise à jour : Voici la démo .

20

Cela peut aider:

export class AppComponent {
 //Array of any value
  jsonData:any = [
    {id: "1", type: "bus", make: "VW", color: "white"},
    {id: "2", type: "taxi", make: "BMW", color: "blue"}
  ];
  _object = Object;
}
<div>
  <table border="1">
    <thead>
      <tr>
        <th *ngFor="let header of _object.keys(jsonData[0]); let i = index">{{header}}</th>
      </tr>
    </thead>
    <tbody>
      <tr *ngFor="let row of jsonData; let i = index">
        <th *ngFor="let objKey of _object.keys(row); let j = index">{{ row[objKey] }} </th>
      </tr>
    </tbody>
  </table>
</div>
1
Sachink