# #reactjs #firebase #firebase-realtime-database
Вопрос:
Сначала я получил только значения каждого ключа, но теперь я понял, что мне понадобятся сами ключи, а затем я получу значения этих ключей. Я прокомментировал то, что делал раньше.
// READ LIST OF STORIES (myFirebase.js)
getListOfStories(location, callWhenFinished) {
let ref = firebase.database().ref(location)
ref
.once("value")
.then((snapshot) => {
let listOfStoryKeys = [];
snapshot.forEach(function(childSnapshot) {
var key = childSnapshot.key
listOfStoryKeys.push(key);
})
for (var storyKey in listOfStoryKeys) {
// printing each story key
console.log(listOfStoryKeys[storyKey])
}
callWhenFinished(listOfStoryKeys);
// var listOfStories = snapshot.val() || [] // all stories or none at all
// callWhenFinished(Object.values(listOfStories));
})
.catch((error) => {
console.log("Couldn't get list of objects: " error);
callWhenFinished([])
});
}
// OTHERPAGE.js Show stories and their values from the DB and into the console
displayStoriesOnPage = (stories) => {
if (stories.length === 0) {
console.log("Error: Did not get list of stories!");
return;
}
// Initially got all the values of each story;
// Now need to get values of each story using their keys
/*
console.log(stories);
for (var iStory in stories) {
const story = stories[iStory]
console.log("Story: " story);
for (var iAttr in story) {
const attr = story[iAttr];
console.log("t " iAttr ": " attr);
}
}
*/
this.setState((state) => {
return {
...state,
allStories: stories,
};
})
}
Комментарии:
1. Вы можете объяснить? Что у вас есть об этой истории и что вы хотите получить?
2. @ Dharmaraj Я хотел бы получить значения (фактические данные), используя каждый ключ. Например, ключ «-MftXA1QzVOMnf4qbako» должен предоставить мне все свои данные или дочерние элементы (imgID, язык, местоположение, статус, название, идентификатор пользователя). Сначала я просто легко получал каждый набор данных, но теперь я изо всех сил пытаюсь получить набор данных с помощью его уникального ключа
3. Когда вы извлекаете данные, вы ничего не храните, кроме ключей. Теперь вы можете сделать еще один запрос в Firebase, чтобы получить данные ключа, установив значение ref
.ref("stories/" theKey)
, но это излишне. Следуйте подробному ответу @Frank.4. Также опубликовано на reddit.com/r/Firebase/comments/ova4y0/…
Ответ №1:
Если вам нужны как ключи, так и значения историй, один из способов сделать это-передать два параметра для обратного callWhenFinished
вызова:
getListOfStories(location, callWhenFinished) {
let ref = firebase.database().ref(location)
ref
.once("value")
.then((snapshot) => {
let listOfStoryKeys = [],
listOfStoryValues = [];
snapshot.forEach(function(childSnapshot) {
listOfStoryKeys.push(childSnapshot.key);
listOfStoryValues.push(childSnapshot.val());
})
callWhenFinished(listOfStoryKeys, listOfStoryValues);
})
.catch((error) => {
console.log("Couldn't get list of objects: " error);
callWhenFinished([], [])
});
}
Вы также можете поместить ключи и значения в один массив, присвоив ключу имя, которое вы не используете ни для одного из ваших других свойств (например $key
). Это выглядело бы примерно так:
getListOfStories(location, callWhenFinished) {
let ref = firebase.database().ref(location)
ref
.once("value")
.then((snapshot) => {
let listOfStories = [];
snapshot.forEach(function(childSnapshot) {
let story = childSnapshot.val();
story["$id"] = childSnapshot.key;
listOfStories.push(story);
})
callWhenFinished(listOfStories);
})
.catch((error) => {
console.log("Couldn't get list of objects: " error);
callWhenFinished([])
});
}
Независимо от того, какой параметр вы используете, вы можете затем повторить значения/ключи истории в реализации обратного вызова и получить доступ как к ключу, так и к значениям свойств.