AngularFire2 Observables - 如何在 UI 中计算树中最后删除的项目?

AngularFire2 Observables - How to account for last removed item in a tree, in the UI?

所以我在这个应用程序中内置了一个评论系统,当我从列表中删除评论时,所有评论都会相应地从 DOM 中删除,除了最后一项.

我相信发生了一些事情,因为 Firebase 评论树中的最后一项正在被删除,它正在删除整个树,从而破坏了正在监视该树的可观察流。最后一项确实被删除,但是,该项目位于 DOM,即使它不再存在于数据库中。

我不确定如何在我的组件中处理这种事情。

调用移除功能的函数如下:

/**
   *  Remove a message
   */
  removeMessage(messageId) {
    this._messages.removeMessage(this.requestId, messageId)
  }

在我的 ngOnInit() 中,我订阅了消息流,您可以在此处看到:

  this.getDiscussionObs = this._messages.getCheckRequestDiscussion(this.requestId).subscribe(messages => {
               if(messages) {
                 this.discussionMessages = messages;
               } else {
                 this.discussionMessages = [];
               }
             });

这是我的 getCheckRequestDiscussion() 函数:

getCheckRequestDiscussion(checkRequestId) {

    // Get request ID
    return this._af.database.list(`/request_discussions/${checkRequestId}`,
        {
          query: {
            orderByChild: 'created_timestamp'
          }
        })
        .switchMap(messages => {

          return Observable.combineLatest(
            messages.map(message => {
              return this._af.database.object(`/users/${message.author_id}`)
            }),
            (...users) => {
              messages.forEach((message, index) => {
                users.forEach(user => {
                  if(message.author_id === user.$key) {
                    messages[index]['author'] = user;
                  }
                })
              })
              return messages;
            }
          )
        })
  }

这是我的提供商中的删除功能:

/**
   *  Remove a message
   */
  removeMessage(checkRequestId, messageId) {
    return this._af.database.list(`/request_discussions/${checkRequestId}/${messageId}`).remove();
  }

奇怪的是,我之前处理过这个问题,除了DOM相应更新,但这里没有。有人知道这里发生了什么吗?

提前致谢!

问题很可能是由于您将 combineLatestmessages 数组一起使用:

...
.switchMap(messages => {
  return Observable.combineLatest(
    messages.map(message => {
      return this._af.database.object(`/users/${message.author_id}`)
    }),
    ...

你没有检查数组的长度。如果它是空的,combineLatest 返回的 observable 将不会发出任何东西。

你应该这样做:

...
.switchMap(messages => {
  return messages.length === 0 ?
    Observable.of([]) :
    Observable.combineLatest(
      messages.map(message => {
        return this._af.database.object(`/users/${message.author_id}`)
      }),
      ...