Как перебрать неизвестное количество вложенных объектов json в Angular с помощью ngFor?

#javascript #json #angular

#javascript #json #angular

Вопрос:

Я пытаюсь отобразить весь ответ из этого json :

https://www.reddit.com/r/AskReddit/comments/k8w43d/people_with_the_last_name_pepper_who_have.json

Итак, в зависимости от загрузки post im и ответа, количество моих дочерних элементов будет отличаться. Как я могу перебирать его, пока не дойду до последнего ответа с дочерними элементами (body[2].data.children)?

Вот так :

 <div class="replies-box" *ngFor="let reply of comments.body[1].data.children">
       <div class="reply-header">
            <p class="reply-author"><b>From</b> : {{ reply.data.author }}</p>
            <p class="reply-send"><b>Send</b> : {{ this.getDateReply(reply.data.created_utc) }}</p>
       </div>
       <div class="text-first-reply" [innerHTML]="this.getHtmlDecode(reply.data.body_html)">
         
       </div>
</div>
 

У меня есть только первый уровень ответа, есть ли способ просто перебрать их все?
Заранее спасибо.

Ответ №1:

Я бы использовал подход рекурсивного типа.

Разработайте app-comment компонент, и если у комментария есть дочерние элементы, выполните цикл по дочерним элементам и отобразите app-comment . Таким образом, он будет перебирать комментарии до тех пор, пока не останется дочерних элементов

 <div *ngIf='comment'>
  <span *ngIf='comment.kind; else showComment'>Kind: {{ comment.kind }}</span>
  <ng-template #showComment>
    <span>{{ comment }}</span>
  </ng-template>
  <div>
   <app-comment *ngFor='let child of comment.data?.children' [comment]='child'> </app-comment>
  </div>
</div>
 

Смотрите этот пример иллюстрации

Комментарии:

1. Это идеально, именно то, что мне было нужно, большое спасибо!

Ответ №2:

Просто используйте ngFor внутри ngFor с помощью ng-контейнера (не будет создавать дополнительные элементы dom)

 <div class="replies-box">
  <ng-container *ngFor="let commentBody of comments.body">
    <ng-container *ngFor="let reply of commentBody.data.children">
      <div class="reply-header">
        <p class="reply-author">
          <b>From</b> : {{ reply.data.author }}
        </p>
        <p class="reply-send">
          <b>Send</b> : {{ this.getDateReply(reply.data.created_utc) }}
        </p>
      </div>
      <div class="text-first-reply" [innerHTML]="this.getHtmlDecode(reply.data.body_html)">

      </div>
    </ng-container>
  </ng-container>
</div>