Angular 6: визуализация вложенного JSON в таблице - PullRequest
2 голосов
/ 06 июля 2019

У меня есть вложенная структура JSON, которая должна быть представлена ​​в таблице.Структура:

students = [
  {
    "id": "1",
    "name": "Ram",
    "subjects": [
      {
        "id": "101",
        "name": "Maths",
        "exams": [
          {
            "id": "1",
            "name": "exam1",
            "score": "90"
          },
          {
            "id": "2",
            "name": "exam2",
            "score": "80"
          }
        ]
      },
      {
        "id": "102",
        "name": "English",
        "exams": [
          {
            "id": "1",
            "name": "exam1",
            "score": "95"
          },
          {
            "id": "2",
            "name": "exam2",
            "score": "85"
          }
        ]
      }
    ]
  },
  {
    "id": "2",
    "name": "Ajay",
    "subjects": [
      {
        "id": "101",
        "name": "Maths",
        "exams": [
          {
            "id": "1",
            "name": "exam1",
            "score": "80"
          },
          {
            "id": "2",
            "name": "exam2",
            "score": "90"
          }
        ]
      },
      {
        "id": "102",
        "name": "English",
        "exams": [
          {
            "id": "1",
            "name": "exam1",
            "score": "85"
          },
          {
            "id": "2",
            "name": "exam2",
            "score": "95"
          }
        ]
      }
    ]
  }
];

Я использую p-table из pringng .Мне нужно иметь представление о таблице следующим образом:

Sample Table Layout

Может ли кто-нибудь поделиться своим опытом рендеринга вложенных json.

Я уже пробовал вложенные таблицы ивложенные циклы в div, но макет испорчен.

Пример кода с p-таблицей (первичное значение):

<p-table #dt [value]="students" [responsive]="true"  [paginator]="true" [rows]="5" 
[rowsPerPageOptions]="[5,10,25,50]" [autoLayout]="true" [globalFilterFields]="['name']" [scrollable]="true" scrollHeight="400px" frozenWidth="300px" >
<ng-template pTemplate="header">

  <tr class="table-header">
    <th style="width:18%" class="table-header-column" >
      <span>Student Name</span>
    </th>
    <th style="width:8%" class="table-header-column"  rowspan="2">
      Subject
    </th>
    <th style="width:6%" class="table-header-column"  rowspan="2">
      Marks
    </th>
  </tr>
  <tr class="table-header">
    <th>
        <input placeholder="Search Student" pInputText size="25"  type="text"
        (input)="dt.filterGlobal($event.target.value, 'contains')">
    </th>

  </tr>
</ng-template>
<ng-template pTemplate="body" let-student>
  <div *ngFor="let subject of student.subjects; index as i" class="table-cell-color">
    <tr *ngFor="let exam of subject.exams; index as j" class="table-cell-color">      
          <td>{{student.name}}</td>
          <td>{{subject.name}}</td>
          <td>{{exam.score}}</td>
    </tr>
  </div>
</ng-template>
</p-table>

Выход:

Output for Primeng

Образец таблицы mdb с mdbBootstrap:

<table class="table table-bordered" mdbTable mdbTableScroll scrollY="true" scrollX="true" >
  <thead>
    <tr class="table-header">
      <th  >Student Name</th>
      <th >Subject</th>
      <th >Marks</th>
    </tr>
  </thead>
  <tbody>
     <tr mdbTableCol *ngFor="let student of students" >
        <div *ngFor="let subject of student.subjects;">
            <div *ngFor="let exam of subject.exams; index as i">
                <td >{{student.name}}</td>
                <td >{{subject.name}}</td>
                <td >{{exam.name}}</td>
            </div>
        </div>
      </tr>
  </tbody>
</table>

Выход:

Output for MdbBootstrap Было бы здорово, если бы кто-то мог поделиться своими мыслями.Я открыт для переключения на любую другую библиотеку, если это необходимо.

...