/ / Nessuna modifica della vista dopo l'eliminazione del nodo Firebase: javascript, angular, firebase, rxjs, angularfire2

Nessuna modifica alla modifica dopo la cancellazione del nodo Firebase - javascript, angolare, firebase, rxjs, angularfire2

Aggiornamento: la seguente domanda si riferisce a combineLatest non emette nulla quando è un array vuotopassato ad esso. Questo potrebbe non essere il tuo problema specifico, ma se la tua vista non si aggiorna dopo aver rimosso o eliminato un nodo Firebase, controlla la gestione degli array vuoti da parte degli operatori specifici. Come descritto nella soluzione, ad alcuni piace combineLatest non emettono nulla quando ricevono array vuoti che non comportano alcun cambiamento nella visualizzazione.

Prendi il seguente esempio:

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
}

... e confronta con questo esempio:

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

o un esempio ancora più semplice:

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

Nel caso del primo esempio, se stai eseguendo il rendering di un elemento nella tua vista, come {{data.property}} ed elimina l'intero file data nodo da Firebase, l'elemento visualizzato nella vista rimarrà nella vista. In altre parole, rimarrà lì fino a quando la pagina non verrà ricaricata.

Negli ultimi due esempi l'oggetto cesserà di essere renderizzato nel momento in cui l'oggetto Firebase che sta osservando viene cancellato.

Perché?

risposte:

1 per risposta № 1

Nel primo esempio, quando elimini i dati dal database, l'elenco genererà un array vuoto. Quando viene ricevuto da switchMap operazione a cui verrà passato un array vuoto combineLatest.

Dalla memoria, quando combineLatest viene passato un array vuoto, non emette nulla. Se non viene emesso nulla, la vista non vede alcun cambiamento, quindi i dati precedentemente renderizzati persistono.

Se dovessi controllare la lunghezza dell'array ricevuto ed emettere un array vuoto se ne viene ricevuto uno, dovresti vedere la vista aggiornata.

Controllando la lunghezza, intendo fare qualcosa del genere:

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