更新:以下问题涉及combineLatest
在向其传递空数组时不发出任何内容。这可能不是您的具体问题,但如果您的视图在删除或删除Firebase节点后未进行更新,请检查您的特定运营商'处理空数组。如解决方案中所述,有些像combineLatest
在收到空数组时没有发出任何内容,导致视图没有变化。
采用以下示例:
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对象被删除时停止呈现。
为什么?
答案 0 :(得分:1)
在第一个示例中,当您从数据库中删除数据时,列表将发出一个空数组。当switchMap
操作收到该数据时,空数组将传递给combineLatest
。
从内存中,当combineLatest
传递一个空数组时,它不会发出任何内容。没有任何发射,视图看不到任何变化,因此以前渲染的数据仍然存在。
如果要检查接收到的数组的长度并在收到数组时发出一个空数组,则应该看到视图已更新。
通过检查长度,我的意思是这样做:
return joinedObservables.length ?
Observable.combineLatest(joinedObservables, () => data) :
Observable.of([]);