Как я могу получить живой результат Firebase, ограниченный созданием? - PullRequest
0 голосов
/ 06 июня 2018

Я разрабатываю приложение для чата на основе Iionic 3 - Firebase, использующее базу данных Firebase Realtime для хранения сообщений, загрузки их в приложение и немедленного их отображения.

Когда открывается чат, я загружаю сообщения, используя следующуюограниченный запрос, поэтому после ввода я только 100 последних сообщений:

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

, который возвращает наблюдаемую коллекцию, и я могу привязать ее непосредственно к угловому шаблону, поэтому, когда приходят новые сообщения или даже другой пользователь удаляетсообщение, чат обновляется.

Но у этой реализации есть две серьезные проблемы: каждый раз, когда я отправляю или получаю сообщение, последнее показанное сообщение скрывается, потому что оно выходит за пределы 100.Кроме того, я не могу реализовать бесконечную прокрутку для загрузки предыдущих сообщений, так как я не могу найти способ добиться этого.

Каково решение для соответствующего увеличения предельного диапазона при поступлении новых сообщений?Как я могу реализовать предыдущую загрузку сообщений в этом сценарии?

1 Ответ

0 голосов
/ 06 июня 2018

Прямо сейчас у вас есть messagesRef, настроенный, чтобы быть списком самых последних 100 сообщений.Поэтому, если добавляется новое сообщение, самое старое сообщение удаляется.Это работает, как и ожидалось.

Звучит так, как будто вы хотите другое поведение: начните с 100 самых последних сообщений, а затем добавьте новые поступающие сообщения. Для этого вам необходимо удалить limitToLast иззапрос.Чтобы убедиться, что вы по-прежнему начинаете с (максимум) 100 сообщений, вам нужно добавить другой критерий: указать, чтобы запрос начинался с определенного сообщения.

Итак, пошагово:

  1. Найти сообщение в позиции n-100
  2. Начать запрос в этом сообщении

В коде это должно выглядеть примерно так:

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