2017-03-05 63 views
1

更新:以下問題與combineLatest有關,因此在將空數組傳遞給它時不會發出任何內容。這可能不是您的問題,但如果您的視圖在刪除或刪除Firebase節點後未更新,請檢查特定運營商對空陣列的處理情況。如解決方案中所述,有些像combineLatest當它們收到空陣列時不會發出任何內容,導致視圖中沒有更改。刪除Firebase節點後沒有看到更改

看看下面的例子:

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 
} 

...並比較這個例子:

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

或一個更簡單的例子:

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

在的情況下,第一個示例,如果您要在視圖中呈現項目,例如{{data.property}}和從Firebase中刪除整個data節點,則視圖中呈現的項目將保留在視圖中。換句話說,它將一直存在,直到頁面重新加載。

在最後兩個示例中,該項目在它所觀察的Firebase對象被刪除的那一刻將不再呈現。

爲什麼?

回答

1

在第一個示例中,當您從數據庫中刪除數據時,該列表將發出一個空數組。當switchMap操作收到時,空數組將傳遞給combineLatest

從內存中,當combineLatest傳遞一個空數組時,它什麼都不會發出。沒有任何事情發生,視圖看不到任何變化,因此之前呈現的數據仍然存在。

如果您要檢查收到的數組的長度併發送一個空數組(如果收到一個數組),則應該會看到更新的視圖。

通過檢查的長度,我的意思是做這樣的事情:

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

感謝一如既往,cartant。你可能會證明你如何去檢查'combinedLated'可能接收到的任何數組的長度嗎? –

+1

添加了一個示例。 – cartant

+0

嗯,當節點被刪除時,這仍然不會導致發射。我只是將排放量記錄到控制檯,當我將節點添加到firebase或訂閱時,控制檯會記錄該對象。如果我刪除節點,則不記錄任何內容。 –