2

Ich bin verrückt danach, also unterbreite ich mich dem Publikum.Wert von Angularfire2 wird wiederhergestellt

Ich muss ein Observable zurückgeben. Ich zuerst Firestore aufrufen, um ein Feld, das ein Array enthält, und dann basierend auf jedem Wert des Arrays, möchte ich den passenden Schlüssel abrufen. Ziemlich einfach normalerweise.

Ich sehe genau, was ich auf der Konsole kann, so Daten sind hier, aber warum zur Hölle erscheinen sie nie in der Ansicht. Bevor ich aufgab, machte ich unzählige Variationen von unten.

Mein Service - Bearbeitet, um Vorschläge zu reflektieren. Noch arbeitet Meine Komponente nicht

getUserActivites() { 

    console.log(this.userId) 
    let array = [] 

    const agenda = this.afs.doc(`users/${this.userId}`).snapshotChanges() 

    agenda.subscribe(list => { 
     const data = list.payload.data().activities 
     data.map(event => { 
     const id = event 
     const dataRef = this.afs.doc(`activities/${event}`).valueChanges() 
     dataRef.subscribe(date => { 
      array.push(date) 
      console.log(array) //array log the expected data in an array of Object 
      return data 
     }) 
     }) 
    }) 
    return agenda 
    } 

public agendaData: Observable<any>

dann in Konstruktor

this.agendaData = this.agenda.getUserActivites()

My View

<div *ngFor="let item of agendaData | async "> 
{{ item.name }} 
</div> 
+0

Hallo @Benoit. Ich bin mir nicht sicher, ob ich es verstanden habe. Ihr Problem besteht darin, dass Sie den Schlüssel eines Elements nicht anzeigen können. Oder alle Daten (z. B. 'item.name')? Wenn es nur der Schlüssel ist, liegt das daran, dass Firestore keinen hat. Sie müssen die Methode [snapshotChanges()] (https://github.com/angular/angularfire2/blob/master/docs/firestore/collections.md#snapshotchanges) verwenden, um sie zuzuordnen und in Ihr Array aufzunehmen. – Will

+0

Mein Problem ist, dass ich überhaupt keine Daten anzeigen kann. In diesem Szenario brauche ich nicht einmal den Schlüssel. Ich möchte nur eine Liste des ausgewählten Dokuments abrufen. Die Auswahl geschieht basierend auf einem Schlüssel, der in 'list.payload.data() gehostet wird. Aktivitäten' – Benoit

+0

Ihr Problem ist, dass Sie versuchen, Daten von subscribe zurückzugeben, was nicht funktioniert :) https://stackoverflow.com/questions/39295854/angular-2-how-to-return-data-from-subscribe – Alex

Antwort

0

Ist getUserActivities =() => {Arbeit?

Ist das Datum beobachtbar?

this.observableBooks = this.bookService.getBooksWithObservable();

getBooksWithObservable(): Observable { Rückgabe this.http.get (this.url) .map ((res: Response) => res.json());

Entschuldigung, wenn es Ihre Frage nicht beantwortet Ich mag mich selbst, was das Problem hier ist!

1

1) Ich glaube, Sie haben subscribe() in this.afs.....snapshotChanges() vergessen. Einer der Unterschiede zwischen Promise und Observables ist, dass Observables faul ist - du musst es abonnieren, um zu arbeiten.

2) Wenn Sie Schlüssel/ID nicht benötigen, sollten Sie valueChanges() verwenden, die einfacher zu verwenden ist. Beispiel (nicht getestet):

getUserActivites() { 
    let agenda = [] //Created for logging only 

    let usersTask = this.afs.object(`users/${this.userId}`).valueChanges();  
    let myReturnTask = usersTask.subscribe(users => {   
     console.log('received users'); 
     users.map(user => {    
      const dataRef = this.afs.doc(`activities/${user.id}`).valueChanges() 

      dataRef.subscribe(date => { 
       agenda.push(date) //For logging purpose I created this array 
       console.log(agenda) //Here I see exactly what I want! 

       return date // Why date is not returned? 
      }) 
     }) 
    }) 

    return myReturnTask; 
} 
+0

Danke @Makah, ich muss 'snapshotChanges()' verwenden, da ich die 'Nutzlast' lesen muss, bevor die nächste 'dataRef' angefordert wird . Ich aktualisiere meinen Code oben mit Ihrem Vorschlag, aber es funktioniert noch nicht. Wie kann ich den von this.agendaData = this.agenda.getUserActivites() 'in meiner Komponente erhaltenen Wert prüfen? – Benoit

+0

@Benoit versuchen, es mit console.log() zu debuggen und zu sehen, was Sie bekommen.Sie können nicht synchron verifizieren, da Sie ein Observable zurückgeben. Ich habe den Code ein wenig geändert, um Ihnen zu helfen. – Makah

+0

Neu in der Firestore-Dokumentation lesen 'Obwohl Cloud Firestore Arrays speichern kann, unterstützt es nicht die Abfrage von Array-Mitgliedern oder die Aktualisierung einzelner Array-Elemente. Also, was ich versuche, ist mit Firestore nicht möglich. Ich werde meine Ansicht überdenken, indem ich eine einzelne Komponente erstelle, die einzelne 'Aktivitäten' beherbergt und dann diese einzelne Komponente basierend auf einem Array von' list.payload.data(). Activities' erstellt – Benoit

Verwandte Themen