Как я могу узнать, какое поле firebase было изменено (с использованием слушателя)? - PullRequest
0 голосов
/ 05 января 2020

У меня в приложении есть следующий слушатель:

firebase.database().ref("salas/" + id).on("value", snapshot => {
   do something...
})

и следующая структура в базе данных:

Firebase structure image

Итак, мне нужно знать, что поле было изменено. Если какое-либо поле или узел этой структуры изменяется, вызывается метод .on (), и я могу получить весь обновленный узел, но мне нужно сделать, какой узел или ключ был изменен, что послужило триггером для вызова метода .on (), например, если был ключ "tela" или узел "acomp_jo go". Возможно ли это?

Ответы [ 2 ]

0 голосов
/ 05 января 2020

Если на родительском узле установлены прослушиватели, обратный вызов, получаемый от прослушивателя, не сообщит вам точно , какой дочерний узел изменился, когда вы получите новый снимок от этого обратного вызова. Вам нужно будет сравнить каждое из дочерних значений (то есть «diff»), чтобы выяснить, какое из них изменилось между предыдущей и новой версией моментального снимка.

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

0 голосов
/ 05 января 2020

Чтобы обнаружить изменения на дочерних элементах direct , вы можете использовать событие child_changed вместо value следующим образом:

  firebase
    .database()
    .ref("salas/" + id)
    .on('child_changed', snapshot => {
      console.log(snapshot.key);
      console.log(snapshot.val());
    });

Если Вы знаете аванс точную структуру данных в "salas/" + id, и эта структура данных имеет ограниченное число детей детей (детей ...), вы можете использовать эту технику и объявить несколько слушателей: один для родительского узла и один для каждого дочернего узла (и, возможно, для каждого дочернего узла дочернего узла ...) следующим образом:

  firebase
    .database()
    .ref("salas/" + id)
    .on("child_changed", snapshot => {
      if (!snapshot.hasChildren()) {   //If the snapshot has some children, we don't do anything, since this case will be taken into account by the listener declared for the child node
        handleChildChange(snapshot.key);
      }
    });

  firebase
    .database()
    .ref("salas/" + id + "/letras")
    .on('child_changed', snapshot => {
      if (!snapshot.hasChildren()) {
        handleChildChange("letras/" + snapshot.key);
      }          
    });

  firebase
    .database()
    .ref("salas/" + id + "/temas")
    .on('child_changed', snapshot => {
      if (!snapshot.hasChildren()) {
        handleChildChange("temas/" + snapshot.key);
      } 
    });

   //....

   handleChildChange(nodeKey) {
      //Do something with nodeKey
   }

Конечно, этот подход действителен, только если количество слушателей, которые нужно объявить, остается разумным!


Более подробную информацию о различных возможных событиях вы найдете в do c.

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