如何才能在创建时限制实时Firebase结果?

时间:2018-06-06 13:03:37

标签: javascript angular firebase firebase-realtime-database observable

我正在开发一个基于Iionic 3 - Firebase的聊天应用程序,使用Firebase实时数据库来存储消息,将它们加载到应用程序中并立即显示它们。

当聊天对话打开时,我会使用下一个有限查询加载邮件,因此在输入后,我只会收到100封邮件:

this.messagesRef = this.afDB.list(
    `/messages/${this.me.uid}/conversations/${this.contact.uid}/messages`, ref =>  
   .limitToLast(100)).valueChanges();

返回一个可观察的集合,我可以将它直接绑定到角度模板,因此当新消息到达或者其他用户删除消息时,聊天会很好地更新。

但是这个实现有两个严重的问题:每次我发送或接收消息时,最后一条消息显示隐藏,因为它超出了100的限制。此外,我无法实现无限滚动来加载以前的消息,因为我无法找到实现它的方法。

当新邮件到达时,哪种解决方案可以使限制范围相应增加?如何在该场景中实现先前的消息加载?

1 个答案:

答案 0 :(得分:0)

现在,您已将messagesRef设置为最近100封邮件的列表。因此,如果添加新消息,则删除最旧的消息。这是按预期工作的。

听起来你想要一个不同的行为:从100条最新消息开始,然后添加任何新消息。为此,您需要从查询中删除limitToLast。为确保您仍然以(最多)100条消息开头,您需要添加不同的条件:告诉查询从特定消息开始。

所以步骤:

  1. 在位置n-100
  2. 处查找消息
  3. 在那个消息开始查询
  4. 在代码中,这应该类似于:

    ref.orderByKey().limitToLast(100).once('child_added', function(snapshot) {
      var oldestKey = snapshot.key;
      this.messagesRef = this.afDB.list(
        `/messages/${this.me.uid}/conversations/${this.contact.uid}/messages`, ref =>  
       ref.orderByKey().startAt(oldestKey)).valueChanges());
    })