Firebase节点删除后没有查看更改

时间:2017-03-05 08:02:26

标签: javascript angular firebase rxjs angularfire2

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

为什么?

1 个答案:

答案 0 :(得分:1)

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

从内存中,当combineLatest传递一个空数组时,它不会发出任何内容。没有任何发射,视图看不到任何变化,因此以前渲染的数据仍然存在。

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

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

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