angular - Găsirea dificultății de a afișa datele care sunt afișate în consolă pentru a fi afișate în vizualizare


Am o bază de date Firestore care arată astfel. În prezent, preiau date din colecția userFavorites.

Serviciul meu preferat

   async getfavoriteList(): Promise<firebase.firestore.QuerySnapshot> {
    const user: firebase.User = await this.authService.getUser();
    if (user) 
          {
    this.FavoriteListRef = firebase
      .firestore()
      .collection(`userFavorites`);
    return this.FavoriteListRef.where('uid', '==', user.uid).get();
              }
           } 
       }

TS preferat

  favoriteList: any; 
  public favoriteListRef: firebase.firestore.CollectionReference;


    this.favoriteService.getfavoriteList().then(favoriteListSnapshot => {
      this.favoriteList = [];
      favoriteListSnapshot.forEach(snap => {
        this.favoriteList.push({
          id: snap.id,
          favoriteList: snap.data().favourite
        });
        console.log(snap.data().favourite)
        return false;
      });
    });
  }

Acum, când fac console.log acestui dat folosind -- console.log(snap.data().favourite),

Văd datele în consolă.

Totuși, aceste date nu se afișează în vizualizare cu următorul HTML pe care l-am încercat. De asemenea, am încercat să afișez datele folosind tubul JSON.

<ion-grid>
        <ion-row>
        <ion-col size="12" >
        <ion-card *ngFor ="let favorite of favoriteList">
           <!--  <img [src]="favorite?.image[0]">
            <img [src]="favorite?.favorite.image[0]"> -->
          <div class="card-title">{{ favorite | json }}</div>
        <div>{{favorite?.description}}</div>
        </ion-card>
        </ion-col>
      </ion-row>
      </ion-grid>  

Ce fac greșit?

Răspuns #1

Ai creat un șir:

this.favoriteList = [];

atunci împingi un obiect:

 this.favoriteList.push({
      id: snap.id,
      favoriteList: snap.data().favourite
    });

Deci ai un array imbricat:

 favoriteList[i].favoriteList // you should iterate here

Deci codul ar trebui să arate astfel:

    <ion-card *ngFor ="let favorite of favoriteList">   
        <ng-container *ngFor="let item of favorite?.favoriteList">
            <img [src]="item.image[0]">
            <div class="card-title">{{ item | json }}</div>
            <div>{{item?.description}}</div>
        </ng-container>
    </ion-card>

Răspunsul #2

Deoarece populați array-ul dvs. într-un mod asincron, prima dată când HTML-ul dvs. analizează array-ul, acesta este încă gol. Totuși, deoarece nu oferiți o referință nouă pentru acest array atunci când îl populați, Angular nu își reîmprospătează vizualizarea. Așadar, fie trebuie să rulați detectarea manuală a schimbărilor după ce știți că array-ul este complet, fie puteți face ceva de genul:

private favoriteListDisplay = new BehaviourSubject<any[]>([]);

și apoi, în loc de console.log-ul tău, poți să faci:

this.favouriteListDisplay.next(this.favoriteList)

și apoi HTML-ul tău:

 <ion-card *ngFor ="let favorite of favoriteListDisplay | async">

în acest fel vei spune Angular să declanșeze un alt ciclu de detectare a schimbărilor și afișare a datelor tale.