简体   繁体   中英

AngularFire - How to push collection items into an array

I have an AngularFire collection query from firestore. I would like to push each of the returned items into my array. Below is what I have tried so far.

The result is that only the last item is entered into the array. If I remove this.myArr = []; from inside the query, all the results appear in the array on load. However, as you can imagine, when a new item is added, everything is readded to the array, opposed to the latest item. I assume that for each item, the array is being cleared, and then added to, hence the last item only being added.

How do I ensure that each item is added to the array, and not just the last?

 this.myArr = [];

   ...

  issueData() {
    this.albumCollection = this.afs.collection<any>(`album/albumID}/issues`, ref => {
      return ref.orderBy('order');
    });

    this.issues = this.albumCollection.snapshotChanges().pipe(
      map(actions => actions.map(a => {

        const data = a.payload.doc.data();
        const id = a.payload.doc.id;

        this.myArr = [];
        this.myArr.push({ id, ...data });

        return { id, ...data };

      }))
    );
}

HTML

 <div *ngFor="let issue of myArr"> a </div>

Why do you use a specific variable when your observable return already your array?

issueData() {
    this.albumCollection = this.afs.collection<any>(`album/albumID}/issues`, ref => {
      return ref.orderBy('order');
    });

    this.issues = this.albumCollection.snapshotChanges().pipe(
        map(actions => actions.map(a => {

            const data = a.payload.doc.data();
            const id = a.payload.doc.id;


            return { id, ...data };

        }))
    );
}

Then, in your template, your subscribe to your observable to access the data:

<div *ngFor="let issue of issues | async">{{issue | json}}</div>

If your really need a variable to cache your result, you can use a tap operator (no need to push yourself data into the array):

this.myArr = [];

issueData() {
    this.albumCollection = this.afs.collection<any>(`album/albumID}/issues`, ref => {
      return ref.orderBy('order');
    });

    this.issues = this.albumCollection.snapshotChanges().pipe(
       map(actions => actions.map(a => {

         const data = a.payload.doc.data();
         const id = a.payload.doc.id;


         return { id, ...data };

       })),
       tap(data => this.myArr = data)
   );
}

But don't forget that you will have to subscribe to the observable to feed this.myArr , otherwise, it will stay empty.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM