2017-10-09 4 views
1

Mit AngularFire2 Ich versuche, Daten aus einem einzigen Firestore-Dokument zu erhalten. Was funktioniert, ist:AngularFire2 Firestore nehmen (1) auf doc valueChanges

this.addressRef = afs.doc<Address>('addresses/key') 
this.addressRef.valueChanges().subscribe(val => {......} 

Ich möchte nur einmal das Abonnement Code auszuführen. Normalerweise benutze ich take (1) um dies zu erreichen (funktioniert mit der Firebase DB). Aber dieser Code:

this.addressRef.valueChanges().take(1).subscribe(val => {......} 

gibt Fehler: Typeerror:. This.addressRef.valueChanges (...) nehmen ist keine Funktion.

VS-Code listet die Take-Aktion auf. Ist das ein Fehler in AngularFire2, mache ich das falsch oder gibt es einen anderen (besseren) Weg, das Abonnement zu stoppen, nachdem die Daten abgerufen wurden? Ich habe auch versucht, topomise, aber das ist auch gescheitert.

Antwort

3

Sie können dies erreichen, indem Sie folgendermaßen vorgehen:

this.userDoc = afDs.doc<User>('users/NaGjauNy3vYOzp759xsc'); 
this.userDoc.valueChanges() 
.take(1) 
.subscribe(v => { 
    this.user = v; 
}) 

Ich habe eine stackblitz für Sie bereitgestellt: https://stackblitz.com/edit/angular-snnbwd

Gehen Sie einfach zu app/hello.component.ts um den Code zu sehen.

+1

Okay, zuerst habe ich in Ihrer Antwort nicht viel Neues gesehen, da ich bereits denselben Code verwende, aber take() funktioniert nicht in meinem Setup. Aber nach dem Studium Ihres Stackblitz habe ich festgestellt, dass meine Importe anders sind. Ich schätze, sie wurden automatisch von VC generiert. Ich hatte "rxjs/operator/take" als Importpfad. Sie haben es wie in Ihrem Beispiel in "rxjs/add/operator/take" geändert und nun funktioniert take(). Vielen Dank für die Bereitstellung des vollständigen Codes. Ich werde weitere Forschungen über diese verschiedenen Wege durchführen. – majodi

+0

und jetzt jedes Mal, wenn Sie beispielsweise user.uid benötigen, um anderen Code zu schreiben, müssen Sie dies innerhalb des Abonnements tun? Das macht den Code so komisch und verschachtelt. Können Sie nicht die aktuelle Benutzer-UID aus der Datenbank holen und etwas damit in Ihrer Komponente (also nicht HTML) tun, ohne ein Abonnement? – Ruben

+0

@Ruben brauchst du noch Hilfe dabei? Die kurze Antwort ist ja - Sie müssen abonnieren. Aber du musst es nicht mehr als einmal anrufen :) – DauleDK

Verwandte Themen