Как сопоставить данные, которые извлекаются из Api в angular

#angular

#angular

Вопрос:

Я извлек имена авторов вместе с их сообщениями из api. Сначала отображается список всех авторов; имена авторов, после этого отображается список всех сообщений. но я хочу, чтобы в нем отображалось имя автора с их соответствующими сообщениями. Я пробовал несколько способов, но это не сработало.Пожалуйста, помогите мне. Вот мой код

data.service.ts

        constructor(private http: HttpClient) {}

       getuserdetails(){
           return this.http.get<any> 
          ('http://jsonplaceholder.typicode.com/users')
          .pipe(map(item => {
           return item;
          }));
         }

      getposts() {
            return this.http.get<any> 
           ('http://jsonplaceholder.typicode.com/posts')
           .pipe(map(user => {
           return user;
         }));
         }
 

home.component.ts

       dataItem:any = {} 
      post:any = {} 

     constructor(private data: DataService) {

          this.data.getuserdetails().subscribe(item=>{
          this.dataItem=item;
        });

          this.data.getposts().subscribe(element=>{
          this.post=element;
       });

    }
 

home.component.html

    <div *ngIf="dataItem?.length>0">

      <div *ngFor='let x of dataItem'>
         {{x.name}}
      </div>

      <div *ngFor='let y of post'>
          {{y.body}} 
      </div>

   </div>
 

Ответ №1:

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

  constructor(private data: DataService) {
         zip(this.data.getuserdetails(),this.data.getposts()).subscribe((results)=> 
          {
             this.dataItem = results[0];
             this.post = results[1];
          });

        });


       });
 

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

1. получение ошибки — свойство ‘subscribe’ не существует для типа ‘UnaryFunction<Observable<{}>, Observable<[{}, any, any]>>

2. импортируйте { zip} из ‘rxjs’; запишите это в файл

3. я уже написал import { zip} из ‘rxjs’, но все еще получаю ошибку

4. попробуйте удалить this.data.getuserdetails() и оставить второй. вы получаете ту же ошибку?

5. Да, сэр. снова та же ошибка. Сэр, не могли бы вы, пожалуйста, скопировать и вставить мой код в ваше программное обеспечение и попытаться выполнить его. это будет действительно полезно.

Ответ №2:

Вы можете попробовать создать пользовательский канал фильтрации

 <div *ngIf="dataItem?.length>0">

    <div *ngFor='let x of dataItem'>
    {{x.name}}
        <div *ngIf="post amp;amp; post.length">
            <div *ngFor="let y of post | filter : x.id">
                {{y.body}} 
            </div>
        </div>
    </div>
</div>
 

Канал

 import { Pipe, PipeTransform } from '@angular/core';
@Pipe({
    name: 'filter'
})
export class FilterPipe implements PipeTransform {
    transform(items: any[], userId: any): any[] {
        if(!items) return [];
        if(!userId) return items;
        return items.filter( it => it.userId == userId);
    }
}
 

Также вы должны импортировать этот канал фильтра в какой-либо модуль и добавить его в объявления: [] и экспорт: []

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

1. Конечно, паван. я отвечаю вам в течение нескольких минут

2. ошибка получения: ОШИБКА TypeError: не удается прочитать свойство ‘id’ неопределенного

3. @Ronit: попробуйте фильтр: x.id

4. Спасибо, брат, я получил результат. но в консоли ОШИБКА TypeError: items.filter не является функцией

5. @Ronit: просто нужно добавить *ngIf=»post amp;amp; post.length», я обновил сообщение