2017-12-21 41 views
3

Firebase RTDB 목록을 사용하여 채팅 앱을 구현하고 있습니다. 그런 다음AngularFire 목록에서 새 항목 만 가져 오기

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

내가 구성 요소 (페이지)에서 호출 같은 : 여기에 단순화 된 데이터 서비스 구현의

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

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

원하는 결과를마다하는 새 메시지가 대화에 추가됩니다되어, I 새로운 메시지를 얻으십시오. 무슨 일이 일어나고 있는지 나는 전체 메시지 목록을 얻고있다. 필자가 염려하는 점은 메시지 목록이 커짐에 따라 목록을 다시 표시해야하므로 UI ​​성능이 저하되기 시작합니다. 불필요한 트래픽을 보내는 대역폭은 Firebase에서 전체 목록을 검색하는 것으로 가정하므로 잘.

변경되거나 새 항목 만받을 수있는 방법이 있습니까? 항목에는 목록에 $ 키가 있으므로 어떤 항목인지 알 수 있습니다.

답변

2

는 물론, 그것은 가능하다 :

중포 기지 실시간 데이터베이스

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

중포 기지 경우 FireStore

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

당신은 또한 사용할 수 있습니다 limitToLast 또는 limit 가장 최근의 항목을 얻으려면, angularfire2 공식 doc에 관한.

+0

감사합니다. AngularFire2에서 내가 복제하려고하는 버그를 발견했다고 생각합니다. 목록에 둘 이상의 서브 스크립 션이있는 경우 (조회가 아 T), 어떤 이유로 목록을 변경하면 모든 레코드가 리턴됩니다. 같은 목록을보고 있던 다른 Observable의 구독을 취소하면 작업이 명시됩니다. – regretoverflow