Заполнение таблицы с использованием 2 разных * ngFor

Ниже мой массив объектов JSON:

{
  "tagFrequency": [
    {
      "value": "aenean",
      "count": 1,
      "tagId": 251
    },
    {
      "value": "At",
      "count": 1,
      "tagId": 249
    },
    {
      "value": "faucibus",
      "count": 1,
      "tagId": 251
    },
    {
      "value": "ipsum",
      "count": 1,
      "tagId": 251
    },
    {
      "value": "lobortis",
      "count": 1,
      "tagId": 194
    },
    {
      "value": "molestie",
      "count": 1,
      "tagId": 251
    },
    {
      "value": "unde tempor, interdum ut orci metus vel morbi lorem. Et arcu sed wisi urna sit egestas fringilla, at erat. Dolor nunc.",
      "count": 1,
      "tagId": 199
    },
    {
      "value": "Vestibulum",
      "count": 1,
      "tagId": 251
    }
  ]
}

Я хочу отобразить эти атрибуты, а именно. значение, количество и имя тега (которое берется с использованием идентификатора тега) в таблице. Для первых двух атрибутов я использую ngFor. Но я также хочу напечатать tagName, которое я получаю, используя tagId, и сохраняю его в массиве tagNames. Ниже приведен код моего компонента:

frequencies: any;
tagNames: string[] = [];

ngOnInit() {
    if (this.route.snapshot.url[0].path === 'tag-frequency') {
      let topicId = +this.route.snapshot.params['id'];

      this.tagService.getTagFrequency(topicId)
        .then(
            (response: any) => {
          this.frequencies = response.json().tagFrequency
          for(let tagFrequency of this.frequencies) {
            this.getTagName(tagFrequency.tagId)
          }
        }
        )
        .catch(
            (error: any) => console.error(error)
        )
    }
}

  getTagName(tagId: number): string {
    return this.tagService.getTag(tagId)
    .then(
        (response: any) => {
          this.tagNames.push(response.name)
        }
    )
    .catch(
      (error: any) => {
        console.error(error)
      }
    )
  }

И вот как я пытаюсь напечатать их в пользовательском интерфейсе:

<table>
  <thead>
    <tr>
      <th>{{ 'word' }}</th>
      <th>{{ 'tag-name' }}</th>
      <th>{{ 'frequency' }}</th>
      <th></th>
    </tr>
  </thead>
  <tbody>
      <ng-container *ngFor="let name of tagNames">
        <tr *ngFor="let frequency of frequencies; let i=index">
          <td>{{ frequency.value }}</td>
          <td>{{ name }}</td>
          <td>{{ frequency.count }}</td>
        </tr>
      </ng-container>
  </tbody>
</table>

Но я получаю [объектный объект] под именем тега столбца. Может ли кто-нибудь помочь мне решить эту проблему?

Я попытался использовать ng-container, как указано выше, но результат выглядит следующим образом в пользовательском интерфейсе: tag-name-issue

Что неправильно. Мне нужны только первые 3 строки с именами тегов, такими как «Subtag 3», «Zeit1», «Tag 1» для строк 1,2,3 соответственно.

Заранее спасибо.


person Nilakshi Naphade    schedule 11.03.2017    source источник
comment
обновите сообщение с данными json, что облегчает другим   -  person Aravind    schedule 11.03.2017


Ответы (2)


Вы можете использовать индексную переменную, перебирать массив частот в * ngFor и использовать его индекс для имен тегов.

<tr *ngFor="let frequency of frequencies; let i=index">
      <td>{{ frequency.value }}</td>
      <td>{{ tagNames[i] }}</td>
      <td>{{ frequency.count }}</td>
  </tr>

Убедитесь, что вы инициализировали tagNames:

tagNames: строка [] = [];

person Ishrat Jahan    schedule 11.03.2017

У вас не может быть двойного *ngFor на одном элементе. Вы можете использовать вспомогательный элемент <ng-container>, например

  <tr *ngFor="let frequency of frequencies; let i=index">
    <ng-container *ngFor="let name of tagNames">
      <td>{{ frequency.value }}</td>
      <td>{{ name }}</td>
      <td>{{ frequency.count }}</td>
    </ng-container>
  </tr>
person Günter Zöchbauer    schedule 11.03.2017
comment
Мне жаль. Это не работает для нескольких элементов. Например. Если у меня всего 8 строк, то эти 3 атрибута заполняются 8 раз в одной строке. Я просто хочу напечатать это как матрицу 8 x 3. - person Nilakshi Naphade; 11.03.2017
comment
Я думаю, вам нужно только удалить элемент <ng-container> или переместить его за пределы <tr> - person Günter Zöchbauer; 11.03.2017
comment
Что вы подразумеваете под удалением ‹ng-container›?? Если я перенесу его за пределы ‹tr›, появится 64 строки, что означает его повторение 8 раз. Я хочу только 8 рядов. Почему-то я не хочу вложения циклов for. - person Nilakshi Naphade; 11.03.2017
comment
Я не знаю, чего ты хочешь. - person Günter Zöchbauer; 11.03.2017
comment
В таблице два столбца, а именно. value и count заполняются из объекта Frequency, а name заполняется из массива tagNames. Я хочу распечатать их одновременно. - person Nilakshi Naphade; 11.03.2017
comment
Извините, не могу понять из этого объяснения, что вы имеете в виду. Можете ли вы поставить ожидаемый результат HTML на свой вопрос? - person Günter Zöchbauer; 11.03.2017
comment
Я предоставлю снимок того, что я хочу, и того, что в данный момент рендерится - person Nilakshi Naphade; 11.03.2017