2017-12-21 13 views
3

Firebase RTDBリストを使用してチャットアプリを実装しています。ここでは単純化されたデータサービスの実装です:望ましい結果は、私は、毎回が新しいメッセージが会話に追加されるということであるAngularFireリストから新規アイテムを取得する

msgList: Observable<any>; 
this.msgList = this.dp.monitorConversation(conversationId); 

this.msgList.subscribe(message => { 
    console.log('new msg:', message.payload.val()); 
    return message.payload.val(); 
    }); 
}); 

public monitorConversation(conversationId): Observable<any> { 
    return this.afDB.list(`/conversations/${conversationId}/messages`).stateChanges(); 
} 

は、その後、私は次のように(ページ)コンポーネントからそれを呼び出します新しいメッセージを入手してください。起こっているのは、私がメッセージのリスト全体を取得しているということです。私の懸念は、リスト全体がFirebaseから検索されていると仮定しているため、リストが再表示される必要があるため、メッセージのリストが増加するにつれてUIのパフォーマンスが低下し始め、不要なトラフィックを送信する帯域幅です。よく

変更されたアイテムまたは新しいアイテムのみを受け取る方法はありますか?アイテムにはリストに$キーがあるので、どのアイテムがどれであるか分かります。

答えて

2

は確かに、それが可能である:

Firebaseリアルタイムデータベース

this.rtdb 
    .list('path', ref => ref.orderByChild('timestamp').startAt(Date.now())) 
    .stateChanges(); 

Firebase Firestore

this.afs 
    .list('path', ref => ref.where('timestamp', '>', new Date()).orderBy('timestamp')) 
    .stateChanges(); 

使用することもできlimitToLastまたはlimit最新のアイテムを入手するには、anglefire2公式docに関する。

+0

ありがとうございます。 AngularFire2で私が複製しようとしているバグを発見したと思います。リスト(クエリではない)に複数のサブスクリプションがある場合、何らかの理由でリストを変更するとすべてのレコードが返されます。一度私は同じリストを見ていた別のObservableから退会した、それは働いていると述べた。 – regretoverflow

関連する問題