删除 Firebase 节点后视图无变化

No View Change After Firebase Node Deletion

更新:以下问题涉及 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 对象被删除时停止呈现。

为什么?

在第一个示例中,当您从数据库中删除数据时,列表将发出一个空数组。当 switchMap 操作接收到它时,一个空数组将被传递给 combineLatest.

根据记忆,当 combineLatest 传递一个空数组时,它什么都不发出。没有任何发射,视图看不到任何变化,因此之前呈现的数据仍然存在。

如果您要检查接收到的数组的长度并在接收到一个空数组时发出一个空数组,您应该会看到视图已更新。

通过检查长度,我的意思是做这样的事情:

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