Получение нового списка после удаления дочернего элемента из базы данных Firebase

#javascript #firebase #firebase-realtime-database

#javascript #firebase #firebase-realtime-database

Вопрос:

В документации для child_removed указано, что DataSnapshot переданные в обратный вызов будут старыми данными для дочернего элемента, который был удален.

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

 var ref = firebase.database().ref("Windsor boyss").limitToFirst(1);
    ref.on("child_removed", function(snapshot) {
        ref.once("value", function(snapshot) {
            snapshot.forEach(function(childSnapshot) {
                console.log("Child is ", childSnapshot.val);
            });
        });
    }); 
  

Например, когда дочерний элемент с именем пользователя javedh удаляется, EventListener должен запускаться, и он должен печатать Child is tjaved потому что это значение в верхней части базы данных после удаления дочернего элемента в верхней части.

введите описание изображения здесь

Кто-нибудь может помочь мне найти эффективное решение для этого? Спасибо!

Комментарии:

1. Мне непонятно, что вы пытаетесь сделать. Пожалуйста, отредактируйте вопрос, чтобы объяснить более подробно. Это поможет, если вы проиллюстрируете фактическими данными.

2. @DougStevenson Тогда я сделал. Не могли бы вы, пожалуйста, взглянуть и посмотреть, ясно ли это сейчас?

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

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

Ответ №1:

Как прокомментировал Даг, использование вложенного прослушивателя для одной и той же ссылки довольно необычно.

Идиоматический способ использования on("value" , что-то вроде:

 var ref = firebase.database().ref("Windsor boyss").limitToFirst(1);
ref.on("value", function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
        console.log("Child is ", childSnapshot.val);
    });
}); 
  

Обновление: я думаю, что проблема может быть связана с тем фактом, что ваш ref.once("value" обслуживается из локального (в памяти) кэша моментального снимка, который в этой точке не содержит данных.

Я смог обойти это, создав новый запрос для прослушивания внутри обратного вызова вместо прослушивания того же запроса (что вы вызываете ref ):

 var ref = firebase.database().ref("Windsor boyss");
var query = ref.limitToFirst(1);
query.on("child_removed", function(snapshot) {
  console.log("Child " snapshot.val() " was removed");
  ref.limitToFirst(1).once("value", function(snapshot) {
    snapshot.forEach(function(childSnapshot) {
      console.log("First child is " childSnapshot.val());
    });
  });
}); 
  

Полный рабочий тестовый стенд см.:https://jsbin.com/feqojey/edit?js ,консоль

Обратите внимание, что вы пропустили () after val() в цикле, но это не было причиной проблемы.

Комментарии:

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

2. Он ничего не выводит.

3. Я думаю, что мне удалось воспроизвести проблему и обойти ее. Смотрите код в моем ответе и в связанной jsbin.

4. Большое вам спасибо, Фрэнк. Я попробую!

5. Привет, Фрэнк. Я поддержал ваш ответ, но Stackoverflow говорит: «Спасибо за отзыв! Голоса, поданные лицами с репутацией менее 15, записываются, но не изменяют публично отображаемую оценку публикации. »