#javascript #firebase #google-cloud-firestore #google-cloud-storage
#javascript #firebase #google-облако-firestore #google-облачное хранилище
Вопрос:
Я хочу добавить изображение из хранилища Firebase в каждый «li» в приведенном ниже коде, но только у первого li есть изображение. В других тегах img нет определенного src. В консоли нет ошибок, но изображение каждого изображения регистрируется в консоли, но оно не будет применяться к src
Код:
var postDocRef = db.collection('posts').doc(uid).collection('userPosts')
postDocRef.get().then(snapshot => {
setupPosts(snapshot.docs)
})
const posts = document.querySelector('.posts');
const setupPosts = (data) => {
let html = '';
data.forEach(doc => {
var docRefIDpost = docRef.id
const post = doc.data();
const li = `
<li>
<div class="title">${post.title}</div>
<div class="content">${post.content}</div>
<img class="img">
</li>
`;
var imgRef = db.collection('posts').doc(uid).collection('userPosts');
imgRef.get().then(function(snapshot) {
if (snapshot.docs.length > 0) {
snapshot.docs.forEach(doc => {
const data = doc.data();
const picURL = data.picURL
console.log(picURL)
var img = document.querySelector(".img")
img.src = picURL
})
} else {
console.log("PicURL doesn't exist")
}
})
html = li
})
posts.innerHTML = html;
}
});
Комментарии:
1. Вы не можете запросить DOM для элемента до его добавления.
Ответ №1:
Проблема в этой строке:
var img = document.querySelector(".img")
Каждый раз, когда это выполняется, вы загружаете первый .img
элемент из HTML. Что вы на самом деле хотите сделать, это установить изображение на li
то, что вы в данный момент создаете.
Самый простой способ исправить это — добавить img
тег только во li
внутренний цикл:
const setupPosts = (data) => {
let html = '';
data.forEach(doc => {
var docRefIDpost = docRef.id
const post = doc.data();
let li = `
<li>
<div class="title">${post.title}</div>
<div class="content">${post.content}</div>
`;
var imgRef = db.collection('posts').doc(uid).collection('userPosts');
imgRef.get().then(function(snapshot) {
if (snapshot.docs.length > 0) {
snapshot.docs.forEach(doc => {
const data = doc.data();
const picURL = data.picURL
console.log(picURL)
var img = document.querySelector(".img")
li = `<img class="${picURL}">`;
})
} else {
console.log("PicURL doesn't exist")
}
})
li = "</li>";
html = li
})
posts.innerHTML = html;
}
});
Обновленный код:
const setupPosts = (data) => {
let html = '';
data.forEach(doc => {
var docRefIDpost = docRef.id
const post = doc.data();
let li = `
<li>
<div class="title">${post.title}</div>
<div class="content">${post.content}</div>
`;
var imgRef = db.collection('posts').doc(uid).collection('userPosts');
imgRef.get().then(function(snapshot) {
if (snapshot.docs.length > 0) {
snapshot.docs.forEach(doc => {
const data = doc.data();
const picURL = data.picURL
var img = document.querySelector(".img")
li = `<img class="${picURL}">`;
})
} else {
console.log("PicURL doesn't exist")
}
li = "</li>";
html = li
posts.innerHTML = html;
})
})
}
});
Это обновляет HTML после чтения каждого документа.
Комментарии:
1. Теперь я получил ошибку; profile.js: 126 Не найдено (в обещании) Ошибка типа: присвоение постоянной переменной. в profile.js:126 в Array.forEach (<анонимный>) в profile.js:117
2. Да,
li
для этого должна быть обычная переменная. Я обновил свой ответ, но рекомендую искать такие проблемы, если вы получите сообщение об ошибке.3. Теперь тег img полностью удален. Теперь это только заголовок и содержимое div в li
4. Вы прошли через код и проверили, доходит ли он до
li =
строки из моего ответа? Если да, то что происходит в этой строке? Stack Overflow — ужасно неэффективный интерактивный отладчик, поэтому вам придется предпринять подобные шаги самостоятельно, если вы хотите, чтобы мы могли эффективно помочь.5. Хорошо, итак, я просмотрел код сейчас, и это было распечатано как
<li> <div class="title">asdasd</div> <div class="content">asdasdasd</div> </li><img class="https://firebasestorage.googleapis.com/v0/b/midpoint2-1d3e2.appspot.com/o/posts/Skjermbilde42.PNG?alt=mediaamp;token=e8970d40-0ef3-479d-866f-9174fb5b4430">
li: так что