2015-02-01 13 views
5

Powiedzmy, że mam operację "I". Podobnie jak usuwa.Skorzystaj z off() bezpośrednio w wywołaniu zwrotnym on() Firebase?

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

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

Mogę wykonać off() bezpośrednio w on() zwrotnego? Nie muszę określać poprawności eventType?

Nic innego do porządkowania, prawda?

From the docs:
Podobnie, jeśli nie określono inaczej eventType lub oddzwanianie wszystkie wywołania zwrotne dla odniesienia zostanie usunięty.

+4

Jeśli włączasz i wyłączasz ponownie w ten sposób, możesz rozważyć użycie 'once' zamiast tego. –

+0

@FrankvanPuffelen Próbowałem użyć 'once()' w nieco innej wersji powyższego przykładu - 'q.endAt (estimServerTimeMs-5000) .once (...)' - ale tylko 'remove()' usuń pojedynczy rekord (pierwszy w zestawie dopasowującym). Zmiana 'once' na' on' usunie wszystkie pasujące rekordy. Jakiś pomysł, dlaczego tak się dzieje? –

+2

Używając 'once' Firebase uruchomi tylko jedno zdarzenie. Tak więc w przypadku 'child_added' będzie uruchamiany tylko dla jednego dziecka (bez względu na to, ile dzieci pasuje do zapytania). Na oryginalne pytanie, które jest dokładnie to, czego potrzebujesz. Ale rzeczywiście w przypadku przypadku użycia w twoim komentarzu, trzymaj się 'on ('child_added'' i' off' it on we właściwym stanie lub alternatywnie 'once (' value'', a następnie' forEach' nad dziećmi w migawce. –

Odpowiedz

4

Mogę wykonać off() bezpośrednio w on() zwrotnego?

Tak.

Nie muszę określać właściwości eventType?

Prawidłowo. Dokumenty stwierdzają, że jeśli pominięto eventType, wszystkie wywołania zwrotne dla odniesienia zostaną usunięte.

Można też po prostu łańcuch metodę takiego .off() zamiast nazywając ją wewnątrz zwrotnego:

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

Jak Frank van Puffelen suggests w komentarzach, można również użyć .once() method w celu wywołania zwrotnego może być wykonane tylko raz:

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

Zaletą tego podejścia jest to, że nie musisz się martwić o przypadkowe ponowne przenoszenie innych dołączonych zdarzeń.

+5

Nie jestem pewien, że można je powiązać. [.on() zwraca funkcję zwrotną, a nie "kontekst kontekstu"] (https://www.firebase.com/docs/web/api/query/on .html) – Kato

Powiązane problemy