#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, записываются, но не изменяют публично отображаемую оценку публикации. »