2016-10-02 27 views
7

Chcę załadować wszystkie elementy na początku bez pokazywania żadnej wiadomości, ale raz po załadowaniu. Chcę przechwycić dowolny nowy wiersz w subskrybencie i pokazać go na powiadomieniu na pulpicie.jak sprawdzić, czy subskrybowanie zostało zakończone, ładowanie wszystkich istniejących wierszy?

Problem polega na tym, że nie jestem pewien, jak sprawdzić, czy wszystkie poprzednie elementy zostały załadowane i czy wiersz jest nowym elementem, czy też jest z poprzedniego istniejącego elementu.

this.items = this.af.database.list('notifications/'+this.uid+'/'); 
this.items.subscribe(list => { 
    list.forEach(row => { 
     // doing something here... 
    }); 

    // once all the rows are finished loading, then any new row, show desktop notification message 
}); 
+0

AngularFire2 robi to wewnętrznie i emituje tablicę bieżących "rzędów" z obserwowalnego. Będziesz musiał sam zbadać tablicę, aby ustalić, co nowego. Zamiast tego możesz użyć bazowego interfejsu API Firebase. Jeśli użyjesz 'on (" child_added ", ...)' i 'once (" value ", ...)', zdarzenia 'child_added', które otrzymasz przed zdarzeniem' value' będą reprezentować początkowe 'wiersze' i kolejne zdarzenia 'child_added' będą zawierały nowe" wiersze ". – cartant

+0

czy masz przykład tego z kodem angularowym? Nie mogę znaleźć tam dokumentacji na temat tego, jak go używać ("child_added" ...) – Basit

+0

Jest w bazowym [Firebase API] (https://firebase.google.com/docs/reference/js/firebase.database. Odniesienie). Możesz zobaczyć, jak jest używany w źródle [AngularFire2] (https://github.com/angular/angularfire2/blob/2.0.0-beta.5/src/database/firebase_list_factory.ts#L102-L156) dla listy zauważalny. – cartant

Odpowiedz

0

Mam użytkownika lodash na minimalnym kodu.

// this varible holds the initial loaded keys 
let loadedKeys = []; 
this.items = this.af.database.list('notifications/'+this.uid+'/'); 
this.items.subscribe((list)=>{ 
    // we skip it while initial load 
    if(!_.isEmpty(loadedKeys)){ 
    // different is the new keys 
    let newKeys = _.difference(_.map(list, "$key"), loadedKeys); 
    if(!_.isEmpty(newKeys)){ 
     // ... notification code here 
    } 
    } 
    loadedKeys = _.map(list, "$key"); 
}); 
0

zachowują się szukasz jest podejście default Subject w RxJS. Sprawdź this reactiveX url podążając za marmurowym diagramem Publish Subject (odpowiednik Subject w RxJS).

Więc masz dwie proste opcje:

1) Manualna indeksy wierszy witch chcesz wyświetlić like @bash replied

2) Utwórz Rx.Subject() i przypisać tylko najnowszej na wiersze do niego. Następnie subskrybujesz ten temat w obiegu pracy aplikacji.

Zaletą metody 2 jest to, że pojawia się nowa .subscribe, to nie będzie odzyskiwać poprzednich danych.


Edit: Napisałem this codepen jako przewodnik do wdrożenia niestandardowego RxJS Subject. Mam nadzieję, że to pomoże.