2014-06-19 15 views
5

Mam aplikację, w której chcę załadować pewną ilość danych początkowych (wykonanych z Firebase.once('value')), a następnie w którymś momencie chciałbym otrzymywać zdarzenia z węzłów potomnych, które zostały dodane do tego odniesienia do Firebase.Firebase child_added bez wczytywania wszystkich danych najpierw

W tym celu chciałbym użyć Firebase.on('child_added'), ale zgodnie z definicją (i widzianą w praktyce) najpierw ładuje WSZYSTKIE dane z tego punktu odniesienia Bazy Firebase.

Czy istnieje sposób na obejście tego zachowania i tylko nasłuchiwanie zdarzeń child_added. Również obejścia, takie jak wyrzucanie początkowego zestawu danych, nie są rozwiązaniem (wyobraź sobie zestaw danych zawierający ponad milion punktów danych - nie chcę mieć każdego punktu danych tylko po to, aby nasłuchiwać, gdy ktoś doda!).

EDYCJA: Firebase.on('child_added') można łączyć z limit() w celu ograniczenia ilości danych pochodzących z pierwotnego żądania. Prawdopodobnie dla mojej aplikacji, tylko jeden punkt danych zostanie dodany do Firebase w pewnym momencie, więc użyłem Firebase.limit(1).on('child_added'), który ogranicza ilość danych początkowych załadowanych do pojedynczego punktu danych. Ale nie podoba mi się to obejście z dwóch powodów:

  1. To wciąż obejście problemu. Nadal muszę ignorować dane, których nie powinienem się martwić ignorowaniem.
  2. Jeśli z jakiegoś powodu charakter mojej aplikacji miał zostać zmieniony, a ja miałem dodać wiele dzieci do referencji Firebase naraz - czy nałożenie limitu na limit(1) ograniczyłoby otrzymywanie wszystkich dodanych dzieci? Nie jestem pewien, czy tak jest w tym przypadku, lub czy zostanie wywołane child_added dla każdego dodanego dziecka niezależnie, czy zostały dodane jako partia.

Wydaje się, zapewniając true/false flagę jako argument do wywołania będzie to miłe rozwiązanie, ale będę czekać, aby zobaczyć, czy tam jest odpowiedź Byłem tuszowanie ...

+0

Można dodać znacznik czasu utworzenia do każdego zestawu danych i użyć aktualnego znacznika czasu jako zapytania "startAt" https://www.firebase.com/docs/ordered-data.html https://www.firebase.com/docs /javascript/query/startat.html – Prinzhorn

+0

To działałoby dobrze ze sposobem, w jaki rzeczy są obecnie zorganizowane - "kluczem" danych (w kluczu: format val) jest znacznik czasu danych. Dzięki za informację! – MandM

Odpowiedz

5

usuń stare wiadomości

Jeśli nie interesują Cię dane historyczne, wykorzystujesz je jako kolejkę wiadomości. W takim przypadku stare zapisy powinny zostać usunięte (lub zarchiwizowane na alternatywną ścieżkę) po ich przeczytaniu. W ten sposób problem sam się rozwiązuje.

Jeśli chcesz zachować ten model, dostępny jest kilka dobrych opcji:

sklep ostatniego odczytu klucz i użyć jej jako punktu startowego następnego obciążenia

Można nawet przechowywać klucz w Firebase priorytetów

var fb = new Firebase(URL); 
fb.child('last_read_key').once('value', function(lastReadSnap) { 
    var lastKey = lastReadSnap.val(); 
    var pri = lastReadSnap.getPriority(); 
    fb.child('data_to_read').startAt(pri, lastKey).on('child_added', function(snap) { 
     if(snap.name() !== lastKey) { 
     console.log('new record', snap.name()); 
     fb.child('last_read_key').setWithPriority(snap.name(), snap.getPriority()); 
     } 
    }); 
}); 

użytkowania, aby zaznaczyć znacznik czasu starych zapisów

Kiedy pisanie rekordy, wykorzystanie setWithPriority:

fb.child('records/$recordid').setWithPriority(data, Firebase.ServerValue.TIMESTAMP); 

Teraz możesz czytać rekordy zaczynające się na "teraz":

fb.child('records').startAt(Date.now()).on('child_added', function(snap) { 
    console.log('new child', snap.name()); 
}); 

Note jednym zastrzeżeniem stosowania znaczników czasu tutaj. Użyłem Date.now() w poleceniu startAt(), ponieważ obecnie nie obsługuje Firebase.ServerValue.TIMESTAMP (błąd został zgłoszony w tym celu).

Powiązane problemy