2017-04-12 7 views
1

私はこのアプリケーションに組み込まれているコメントシステムを持っています。リストからコメントを削除すると、最後のアイテムを除いてすべてがDOMから削除されます。AngularFire2 Observables - ツリー内の最後に削除されたアイテムをUIでどのように考慮するか?

Firebaseのコメントツリーの最後の項目が削除されているため、ツリー全体が削除され、そのツリーを監視していた観測可能なストリームが中断されていると思われます。最後の項目は実際には削除されますが、項目はデータベースに存在しなくてもDOMに格納されます。

私のコンポーネントでこのようなことをどう扱うべきか正確にはわかりません。ここで

は、削除機能を呼び出す関数です:私のngOnInit(インサイド

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

)、私はあなたがここに見ることができるようにストリーミングメッセージに加入しています:

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; 
      } 
     ) 
     }) 
    } 

ここに私のプロバイダの削除機能があります:

DOMの更新を除いて、これまで私がこの問題に取り組んできたのは不思議ですが、ここではそうではありません。誰がここで何が起こっているかの手がかりを持っていますか?

ありがとうございます!

+0

'getCheckRequestDiscussion'の実装がどのように見えるのでしょうか? – cartant

+0

ちょっと@cartant、私は 'getCheckRequestDiscussion'関数を追加しました。何かそこに目立つ? –

答えて

1

問題は、あなたがmessages配列でcombineLatestを使用する可能性が高いです。

... 
.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}`) 
     }), 
     ... 
+0

あなたに感謝して、時と時間を再び悩ませている問題が解決されました。そんなにうまくいってくれてありがとうございました:) –

関連する問題