Создайте таблицу из данных массива в Angular

Я пытаюсь создать таблицу с динамическими столбцами. Итак, есть 3 столбца, которые постоянно присутствуют, а остальные генерируются динамически. Например

var newCol = ["node1","node2","node3"];

Тогда мне нужно иметь в общей сложности 6 столбцов в таблице.

Таблица должна выглядеть так:

ID     TS     Node     node1       node2      node3
1      ts1     a
2      ts2     a
3      ts3     b
4      ts4     c
5      ts5     a
6      ts6     b

У меня есть такие массивы:

var idArray = ["1","2","3","4","5","6"];
var ts = ["ts1","ts2","ts3","ts4","ts5","ts6"];
var node = ["a","a","b","c","a","b"];

var newCol = ["node1","node2","node3"];

Таким образом, логика массива newCol заключается в том, что для каждого элемента в массиве newCol и для отображения результатов необходимо выполнить вызов API. Прямо сейчас API не готов, и я пытаюсь создать скелет, как показано в таблице выше. API вернет ответ в следующем формате

Редактировать :

Однако мне также нужен colArray, который должен быть в таблице. Так например

 newCol.forEach(node => {
           this.httpClient.get(this.URL1 + node).subscribe(data => {

           add the data into a array (create array of array)

          });
   });

например: URL/newCol[0] вернет данные для API, которые будут выглядеть так:

{
  "totalReqCount": 6,
  "map": {
    "id1": {
      "api": "asd",
      "tID": "id1",
      "processedTimeDuration": "00:00:11"
    },
    "id2": {
      "api": "asdf",
      "tID": "id2",
      "processedTimeDuration": "00:00:38"
    },
    "id3": {
      "api": "asdfg",
      "tID": "id3",
      "processedTimeDuration": "00:00:59"
    },
    "id4": {
      "api": "qwe",
      "tID": "id4",
      "processedTimeDuration": "00:00:25"
    },
    "id5": {
      "api": "qwer",
      "tID": "id5",
      "processedTimeDuration": "00:00:00"
    },
    "id6": {
      "api": "qwerty",
      "tID": "id6",
      "processedTimeDuration": "00:00:02"
    },
}

Постановка проблемы заключается в том, как заполнить данные для столбцов в массиве столбцов в таблице.

Вот пример stackblitz для того же самого.

https://stackblitz.com/edit/angular-hsmswb?file=app/table-basic-example.html

Может ли кто-нибудь помочь с тем же. Большое спасибо


person dper    schedule 05.08.2019    source источник
comment
Где именно вам нужна помощь? Сделать вызов API? Или заполнить таблицу своими данными? (статически)   -  person sagat    schedule 05.08.2019
comment
@sagat Заполнение данных из массивов. Итак, я могу получить данные в массивы, но не могу передать их в таблицу. Может быть, это действительно наивный вопрос, извините меня за это. Я действительно новичок в angular... Поэтому мне просто нужно понять, как визуализировать таблицу, как показано.   -  person dper    schedule 05.08.2019
comment
хорошо, я понял...   -  person sagat    schedule 05.08.2019
comment
То, как вы используете матовый стол в своем примере, отличается от традиционного подхода. ДОЛЖЕН ли он использовать мат-таблицу?   -  person Andrew Junior Howard    schedule 05.08.2019
comment
@AndrewJuniorHoward Не совсем так, я впервые работаю с таблицами, и для создания динамической таблицы, сгенерированной столбцами, я начал пробовать то же самое. Я не обязан использовать мат-таблицу, если это можно сделать с помощью любого другого ресурса, я был бы рад.   -  person dper    schedule 05.08.2019
comment
@sagat Не могли бы вы предоставить демо-код для того же самого .. Большое спасибо за помощь   -  person dper    schedule 05.08.2019
comment
Ваш stackblitz не работает с ошибкой Error in app/table-basic-example.ts (21:10) ',' expected.   -  person Nicholas K    schedule 05.08.2019
comment
@ user3759616 пожалуйста, смотрите мой ответ :)   -  person Andrew Junior Howard    schedule 05.08.2019
comment
@ user3759616 ты это видел?   -  person Andrew Junior Howard    schedule 06.08.2019
comment
@AndrewJuniorHoward Привет, Эндрю, спасибо, что помог мне с тем же. Хотя это и не было той целью, которую нужно было достичь. Хотя я получил много информации из вашего ответа.   -  person dper    schedule 06.08.2019


Ответы (3)


проверьте рабочий пример https://stackblitz.com/edit/angular-hsmswb-kap4ph

Дайте мне знать, если у вас есть сомнения.

Изменения, которые я сделал.

таблица-основной-example.ts

Я переместил все переменные внутри класса

public idArray = ["1","2","3","4","5","6"];
public ts = ["ts1","ts2","ts3","ts4","ts5","ts6"];
public node = ["a","a","b","c","a","b"];
public newCol = ["node1","node2","node3"];

добавил dataSource variable public dataSource = [];

измененные значения строки displayedColumns: string[] = ['position', 'name', 'weight']; должны быть такими же, как мы используем в <ng-container matColumnDef="position">.

таблица-основной-example.html

<ng-container matColumnDef="position">
    <th mat-header-cell *matHeaderCellDef> idArray </th>
    <td mat-cell *matCellDef="let element"> {{element.id}} </td>
  </ng-container>

  <ng-container matColumnDef="name">
    <th mat-header-cell *matHeaderCellDef> ts </th>
    <td mat-cell *matCellDef="let element"> {{element.ts}} </td>
  </ng-container>

  <ng-container matColumnDef="weight">
    <th mat-header-cell *matHeaderCellDef> node </th>
    <td mat-cell *matCellDef="let element"> {{element.node}} </td>
  </ng-container>
person Piyush Jain    schedule 05.08.2019
comment
Большое спасибо за ваш ответ. Тем не менее, это дает мне ответ на половину постановки задачи. Я отредактировал вопрос для лучшего понимания. Не могли бы вы взглянуть на это и сообщить мне процедуру для того же самого. Очень ценная помощь. - person dper; 05.08.2019
comment
шаги для вашего обновленного запроса. 1. displayedColumns: string[] = ['position', 'name', 'weight', 'node1', 'node2', 'node3']; 2. for (let i = 0; i < this.idArray.length; i++) { this.dataSource.push({ id: this.idArray[i], ts: this.ts[i], node: this.node[i] }); this.newCol.map((val, index) => { this.dataSource[i][val] = this.newColData[index].map[id${this.idArray[i]}]; }) } - person Piyush Jain; 05.08.2019
comment
вы можете проверить обновленный код по тому же URL-адресу - stackblitz.com/edit/angular-hsmswb-kap4ph - person Piyush Jain; 05.08.2019
comment
Еще раз спасибо за такой же ответ. Но дело в том, что он не динамичен по своей природе. Что, если colArray имеет 4 объекта вместо 3. Итак, я ищу генерацию динамического контента вместо статического. Я думаю, что-то вроде ngFor в html. Хотя я не могу понять, как это использовать.. - person dper; 05.08.2019
comment
длину можно получить из самого colArray, поскольку я получаю этот массив через сам API. Ваш код имеет статические значения node1, node2, node3, а это не то, что я ищу. Остальная часть реализации такая же ... единственное, что мне нужно выяснить, это отображать эти столбцы в html, не определяя столбцы предварительно - person dper; 05.08.2019
comment
чтобы сделать заголовок столбца динамическим, вы можете сделать это следующим образом. 1. displayedColumns: string[] = ['position', 'name', 'weight']; 2. this.newColData.map((v, i) => { this.displayedColumns.push(узел${i+1}); }) - person Piyush Jain; 05.08.2019

Это лучший практический способ сделать это. Таким образом, серверная часть может создать столько столбцов, сколько пожелает, без участия клиентской части:

https://stackblitz.com/edit/angular-hsmswb-qxwdsa?file=app%2Ftable-basic-example.html

Короче говоря, ваш внутренний код должен быть структурирован следующим образом:

yourData = [
  {
    "columns": [
      {
        "heading": "Name",
        "field": "name"
      },
      {
        "heading": "Age",
        "field": "age"
      },
      {
        "heading": "Address",
        "field": "address"
      },
      {
        "heading": "Telephone Number",
        "field": "telephoneNumber"
      }
    ],
    "data": [
      {
        "name": "Andrew",
        "age": "22",
        "address": "1 Howick Place",
        "telephoneNumber": "6546546546"
      },
      {
        "name": "Simon",
        "age": "32",
        "address": "2 Howick Place",
        "telephoneNumber": "6546546456547"
      },
      {
        "name": "Brian",
        "age": "28",
        "address": "3 Howick Place",
        "telephoneNumber": "6546546456547"
      }

    ]
  }];

Обратите внимание, что поле columns.field ДОЛЖНО соответствовать ключу, используемому в массиве данных. Этот подход великолепен, так как вы не сможете использовать mat-table, поэтому он будет работать с традиционными таблицами.

person Andrew Junior Howard    schedule 05.08.2019

Я думаю, что лучший способ решить эту проблему — создать массив объектов, где каждый объект представляет собой строку в вашей таблице.

array = [
    {
        id: 1,
        TS: ts1,
        Node: a,
        node1: '',
        node2: '',
        node3: '',
    }, {
        id: 2,
        TS: ts2,
        Node: B,
        node1: '',
        node2: '',
        node3: '',
    }
]

Затем вы можете использовать *ngFor для перебора вашего <tr></tr>

<tr *ngFor="let row of array">
<td>{{row.id}}</td>
<td>{{row.TS}}</td>
<td>{{row.Node}}</td>
<td>{{row.node1}}</td>
<td>{{row.node2}}</td>
<td>{{row.node3}}</td>
</tr>

Затем, после того как вы выполнили вызовы API, вы можете заменить значения для node1, node2, node3 и т. д., и таблица будет обновлена.

person Sam    schedule 05.08.2019
comment
Спасибо за ваш ответ. Не могли бы вы рассказать мне, как на самом деле создать этот массив из нескольких массивов. Как я вижу, вы создаете массив объектов JSON. Как видите, у меня есть разные массивы для разных столбцов. Не могли бы вы уточнить то же самое. - person dper; 05.08.2019
comment
for (пусть i = 0; i ‹ this.idArray.length; i++) { this.dataSource.push({ id: this.idArray[i], ts: this.ts[i], node: this.node[i ] }); } - person sagat; 05.08.2019
comment
Да, это будет работать, и тогда вы можете просто вставить пустые значения для 3 дополнительных столбцов, если хотите, в том же цикле for. - person Sam; 05.08.2019
comment
Итак, дело в том, что эти 3 дополнительных столбца не являются конкретными.. их также может быть 4 или 5 или больше. Если возможно для кого-то из вас, не могли бы вы поделиться демонстрацией создания таблицы. Очень ценная помощь @Sam Большое спасибо - person dper; 05.08.2019
comment
Итак, как вы определяете количество этих дополнительных столбцов для рендеринга? Это получено из ответа API? - person Sam; 05.08.2019
comment
@Sam Да, есть вызов API, который возвращает мне этот массив. - person dper; 05.08.2019
comment
@Sam Итак, идея состоит в том, чтобы использовать этот массив для другого вызова API, который вернет мне идентификатор для определенного столбца, и мне нужно отобразить его в таблице. Я знаком с тем, как делать вызовы API, но я впервые работаю с таблицами. - person dper; 05.08.2019
comment
@ Сэм, я отредактировал вопрос, чтобы сделать его более понятным. Не могли бы вы взглянуть на то же самое. Спасибо - person dper; 05.08.2019