2015-02-01 4 views
5

Sagen wir, ich habe eine einmalige Operation. Wie löscht.Verwenden Sie off() direkt in on() Callback Firebase?

var q = ref.child('users').child(targetUserId).child('chat'); 
q.on('child_added', function(obj) { 
    obj.ref().remove(); 

    //This works right? 
    q.off(); 
}); 

Kann ich ausführen off() direkt im on() Rückruf? Ich muss eventType nicht korrekt angeben?

Nichts anderes zu bereinigen, oder?

From the docs:
Und falls kein eventtype oder Rückruf angegeben ist, werden alle Rückrufe für die Referenz entfernt werden.

+4

Wenn Sie es so ein- und ausschalten, können Sie stattdessen "einmal" verwenden. –

+0

@FrankvanPuffelen Ich versuchte 'once()' auf einer etwas anderen Version des obigen Beispiels zu verwenden - 'q.endAt (decuredServerTimeMs-5000) .once (...)' - aber das 'remove()' würde nur Löschen Sie einen einzelnen Datensatz (den ersten im Matching-Set). Wenn Sie "einmal" in "on" ändern, werden alle übereinstimmenden Datensätze gelöscht. Irgendeine Idee warum das sein könnte? –

+2

Bei der Verwendung von 'once' wird Firebase nur ein einzelnes Ereignis auslösen. Im Fall von 'child_added' wird es nur für ein einzelnes Kind ausgelöst (egal wie viele Kinder mit der Abfrage übereinstimmen). Für Ihre ursprüngliche Frage ist genau das, was Sie brauchen. Aber für den Anwendungsfall in deinem Kommentar bleibe bei "on" ("child_added'" und "off" in der richtigen Bedingung oder alternativ "once" ("value" und dann "forEach" über den Kindern im Snapshot). –

Antwort

4

Kann ich ausführen off() direkt im on() Rückruf?

Ja.

Ich brauche nicht zu spezifizieren eventType korrekt?

Korrekt. Wenn die eventType ausgelassen wird, werden alle Rückrufe für die Referenz entfernt, wie die Dokumentation besagt.

Sie auch die .off() Methode, wie diese gerade Kette kann, anstatt sie innerhalb der Callback-Aufruf:

var q = ref.child('users').child(targetUserId).child('chat'); 
q.on('child_added', function(obj) { 
    obj.ref().remove(); 
}).off(); 

Wie Frank van Puffelen suggests in den Kommentaren, können Sie auch die .once() method, um für den Rückruf verwenden können nur einmal ausgeführt werden:

var q = ref.child('users').child(targetUserId).child('chat'); 
q.once('child_added', function(obj) { 
    obj.ref().remove(); 
}); 

Der Vorteil dieses Ansatzes besteht darin, dass Sie sich keine Gedanken über versehentliches Nachdenken machen müssen Verschieben anderer angehängter Ereignisse

+5

Ich bin nicht sicher, dass Sie sie verketten können. [.on() gibt die Callback-Funktion zurück, nicht die 'this' Kontext-Referenz] (https://www.firebase.com/docs/web/api/query/on .html) – Kato