/ / Brak zmiany widoku po usunięciu węzła Firebase - javascript, angular, firebase, rxjs, angularfire2

Brak zmiany widoku po usunięciu węzła Firebase - javascript, kątowy, firebase, rxjs, angularfire2

Aktualizacja: Poniższe pytanie dotyczy combineLatest nie emitując niczego, gdy pusta tablica jestprzeszedł na to. To może nie być konkretny problem, ale jeśli twój widok nie aktualizuje się po usunięciu lub usunięciu węzła Firebase, sprawdź obsługę pustych tablic przez określonych operatorów. Jak opisano w rozwiązaniu, niektóre podobne combineLatest nie emitują nic, gdy otrzymują puste tablice, co nie powoduje zmiany widoku.

Weź następujący przykład:

doSomething(): Observable<any> {
let results = this.af.database.list(`path/to/something`)
.switchMap(data => {
let joinedObservables: any[] = [];
data.forEach(item => {
joinedObservables.push(this.af.database
.object(`path/to/something/else`)
.do(this => {
item.value = this.value;
})
)
})
return Observable.combineLatest(joinedObservables, () => data)
})
return results
}

... i porównaj z tym przykładem:

doSomething(): Observable<any> {
let results = this.af.database.list(`path/to/something`)
.map(data => data.filter(data.poperty === predicate))
return results
}

lub jeszcze prostszy przykład:

doSomething(): Observable<any> {
let results = this.af.database.list(`path/to/something`)
return results
}

W przypadku pierwszego przykładu, jeśli renderujesz element w swoim widoku, np {{data.property}} i usuń całość data węzeł z Firebase, element renderowany w widoku pozostanie w widoku. Innymi słowy, pozostanie tam aż do przeładowania strony.

W dwóch ostatnich przykładach element przestanie być renderowany w momencie usunięcia obserwowanego obiektu Firebase.

Czemu?

Odpowiedzi:

1 dla odpowiedzi № 1

W pierwszym przykładzie, gdy usuniesz dane z bazy danych, lista wyemituje pustą tablicę. Kiedy otrzyma to switchMap operacja, do której zostanie przekazana pusta tablica combineLatest.

Z pamięci, kiedy combineLatest jest przekazywana pusta tablica, nic nie emituje. Gdy nic nie jest emitowane, widok nie widzi zmian, więc wcześniej wyrenderowane dane pozostają.

Jeśli miałbyś sprawdzić długość otrzymanej tablicy i wyemitować pustą tablicę, jeśli zostanie odebrana, powinieneś zobaczyć zaktualizowany widok.

Sprawdzając długość, mam na myśli zrobienie czegoś takiego:

return joinedObservables.length ?
Observable.combineLatest(joinedObservables, () => data) :
Observable.of([]);