Как получать обновления в режиме реального времени, когда в мою базу данных Cloud Firstore вносятся изменения? - PullRequest
0 голосов
/ 09 мая 2018

Я создаю чат, используя Angular и Firebase Cloud Firestore.

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

В моем клиентском приложении каждый раз, когда пользователь отправляет сообщение, новый документ сообщения добавляется в коллекцию groups/{group_uid}/messages/.

В то же время поле документа groups/{group_uid}.current_index увеличивается на 1.

У меня также есть groups/{group_uid}.last_read_index, который является объектом пар ключ-значение, который для каждого члена группового чата сохраняет uid в качестве ключа и индекс в качестве значения;

Я пытаюсь обнаружить непрочитанные сообщения пользователя, проверяя last_read_index пользователя по current_index.

группы.

Для этого в конструкторе app.component, который я сейчас делаю:

constructor(private _auth: AuthService,
          private _chat: ChatService,
          private afDb: AngularFireDatabase) {

 this.afDb.list<any>('groups').valueChanges().subscribe(() => {


    this._chat.getUserGroups().get().then(groups => {
      this.counter = 0;
      groups.docs.forEach(group => {
        const groupData = group.data();
        const groupUnreadMessages = groupData.current_index - groupData.last_read_index[this._auth.currentUserId];
        this.counter = this.counter + groupUnreadMessages;
      });
    });

 });

}

Где this._chat.getUserGroups() возвращает коллекцию всех групп, в которые входит пользователь.

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

Вместо этого я хотел бы, чтобы изменения произошли в режиме реального времени, как мне этого добиться?

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Для углового использования AngularFire2 .Он имеет свойство subscribe , которое отслеживает изменения, происходящие в Firestore

0 голосов
/ 09 мая 2018

Я не знаком с Angular, но я сделал нечто подобное; просто используйте addOnChildEventListener, а в методе onChildChanged() вы можете узнать, когда обновляется база данных, и продолжить что-то там делать. Допустим, сообщения меняются, этот дочерний слушатель будет ждать, пока что-то изменится в базе данных, может пройти некоторое время, прежде чем он обновится, но я думаю, что это довольно быстро, после того, как этот слушатель запущен, вы можете продолжать делать все, что хотите. хочу внутрь onChildChanged.

Взгляните на документы .

onChildChanged (моментальный снимок DataSnapshot, строка previousChildName) метод срабатывает, когда данные в дочернем местоположении изменились.

Посмотрите, это пример из Java. Это то, что я сделал, просто создал метод со ссылкой на базу данных внутри и addOnChildEventListener со всеми методами:

  private void checkUpdatedData(){

        mDatabase.child("Users").child(mAuth.getCurrentUser().getUid()).child("Messages").addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onChildChanged(DataSnapshot dataSnapshot, String s) {

                //If there is a new message i update the UI or bring some value to the user

            }

            @Override
            public void onChildRemoved(DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(DataSnapshot dataSnapshot, String s) {

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

Так как это вызывается в onCreate() (основной метод, который выполняет Activity), слушатель будет постоянно прослушивать изменения, также onChildAdded() вы можете знать, когда новые сообщения добавляются в базу данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...