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

时间:2017-04-12 01:23:27

标签: angular firebase angularfire2

所以我在这个应用程序中内置了一个评论系统,当我从列表中删除评论时,所有这些都会从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更新,但在这里不是。有没有人知道这里发生了什么?

提前致谢!

1 个答案:

答案 0 :(得分:1)

问题很可能是由于您使用combineLatest数组messages而造成的:

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

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

你应该这样做:

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