2017-03-05 2 views
1

Update: Die folgende Frage bezieht sich auf combineLatest, die nichts ausgibt, wenn ein leeres Array an sie übergeben wird. Dies ist möglicherweise nicht Ihr Problem, aber wenn Ihre Ansicht nach dem Entfernen oder Löschen eines Firebase-Knotens nicht aktualisiert wird, überprüfen Sie die Handhabung leerer Arrays durch bestimmte Operatoren. Wie in der Lösung beschrieben, geben einige wie combineLatest nichts aus, wenn sie leere Arrays erhalten, was zu keiner Änderung der Ansicht führt.Keine Änderung nach Löschen des Firebase-Knotens anzeigen

Nehmen Sie das folgende Beispiel:

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 
} 

... und vergleichen zu diesem Beispiel:

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

oder ein noch einfacheres Beispiel:

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

Im Fall von Das erste Beispiel, wenn Sie ein Objekt in Ihrer Ansicht rendern, wie z. B. {{data.property}} und Löschen Sie den gesamten Knoten data aus Firebase, das in der Ansicht gerenderte Objekt bleibt in der Ansicht bestehen. Mit anderen Worten, es bleibt dort, bis die Seite neu geladen wird.

In den letzten beiden Beispielen wird das Objekt nicht mehr angezeigt, sobald das Firebase-Objekt gelöscht wird.

Warum?

Antwort

1

Im ersten Beispiel wird beim Löschen der Daten aus der Datenbank ein leeres Array ausgegeben. Wenn das von der switchMap Operation empfangen wird, wird ein leeres Array an combineLatest übergeben.

Aus dem Speicher, wenn combineLatest ein leeres Array übergeben wird, gibt es nichts aus. Wenn nichts ausgegeben wird, sieht die Ansicht keine Änderung, so dass zuvor gerenderte Daten bestehen bleiben.

Wenn Sie die Länge des empfangenen Arrays überprüfen und ein leeres Array ausgeben würden, wenn eines empfangen wird, sollte die Ansicht aktualisiert werden.

durch die Länge überprüft, ich so etwas wie dies bedeuten tun:

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

Dank, wie immer, cartant. Würdest du vielleicht demonstrieren, wie du die Länge von Arrays überprüfen kannst, die "combinedLated" erhalten könnte? –

+1

Ein Beispiel hinzugefügt. – cartant

+0

Hmm, dies verursacht immer noch keine Emission, wenn der Knoten gelöscht wird. Ich protokolliere Emissionen einfach in der Konsole und wenn ich den Knoten zu Firebase oder Subscribe hinzufüge, protokolliert die Konsole das Objekt. Wenn ich den Knoten lösche, wird nichts protokolliert. –

Verwandte Themen