2017-11-03 3 views
0

Ich versuche derzeit, einen Zähler in Firestore mit Angular 4 einzurichten, das aktualisiert wird, wenn eine Person auf eine bestimmte Schaltfläche klickt. Wenn Sie auf die Schaltfläche klicken, wird der Zähler zwar aktualisiert, aber es wird eine Endlosschleife gestartet. Der einzige Weg, um es zu stoppen, ist die Zeile zu kommentieren, die nicht hilft, da ich den Zähler jedes Mal aktualisieren muss, wenn ich mich entscheide, auf diesen Knopf zu klicken. Hier ist der Code.Update in Firestore verursacht Endlosschleife

addFoodToCart(uid: string, email: string, item: Goods) 
    { 
    this.getUserInDB(email).doc(uid).valueChanges().subscribe(a => 
    { 
     this.getUserInDB(email).doc(uid).collection('cart').add(item); 
     this.getUserInDB(email).doc(uid).update({'food': ++a['food'], 'technology': 0, 'email': email}); 
    }); 
    } 

Wie man sehen kann ich bin auch ein Element in die gleiche Datenbank hinzugefügt, aber ich bemerkte, dass ein Teil auch aus und verursacht noch die unendliche Schleife in der db. Irgendein Grund, warum das passiert und wie man es repariert? Ich verwende Google Chrome auch als meinen Webbrowser für die Entwicklung. Sie wissen nicht, ob das einen Unterschied macht

Antwort

0

Es ist schwer für mich, dies zu testen, aber Sie können den take() Operator fügen Sie das Abonnement nach einer einzigen Rückgabewert kabellos:

addFoodToCart(uid: string, email: string, item: Goods) 
{ 
    this.getUserInDB(email).doc(uid).valueChanges().take(1).subscribe(a => 
    { 
     this.getUserInDB(email).doc(uid).collection('cart').add(item); 
     this.getUserInDB(email).doc(uid).update({'food': ++a['food'], 'technology': 0, 'email': email}); 
    }); 
} 

Vorausgesetzt, dass Sie eine längere haben Live-Abonnement für dieses Dokument an anderer Stelle verdrahtet, dann sollte das Update automatisch wiedergegeben werden.

Hinweis, je nachdem, was Ihre Anwendung ist Sie benötigen diese Anrufe warten (oder die Versprechungen auf andere Weise zu behandeln

+0

Möchten Sie nehmen Operator nach dem Abonnement platzieren. Ich habe versucht zu tun, dass und es ist sagend, dass take() nicht existiert in der Art Subscription –

+0

Ja, du musst den Operator an der Spitze deiner Datei importieren.Schaue dir die eckigen oder rxjs Dokumente durch, um die Syntax zu sehen (Entschuldigung auf meinem Handy, ich würde versuchen zu liefern –

+0

Ich habe versucht, so zu verfahren, wie du es vorgeschlagen hast, und es ist immer noch das Gehäuse, was ich bemerkt habe, ist, dass es ausgeführt wird, wenn ich den Wert in Firestore ändere, also vielleicht seine Ausführung basierend auf der Änderung in der Wert im Firestore dat erniedrigen. –

Verwandte Themen