javascript - 使用实时 Firebase 数据库(Web)在无限滚动中获取空错误
问题描述
所以我正在尝试为我的实时数据库实现无限滚动。目前,我的代码正在一次从我的数据库中加载我所有的图像(存储为引用)。因此,这确实减慢了网站的速度,并且由于所有数据总是被传输,因此我花费了更多的钱。我尝试使用几行来获取对数据库中键的引用,以跟踪已加载的数据:
//This snippet of code does not work
var referenceToOldestKey = '';
if (!referenceToOldestKey) {
firebase.database().ref('Posts/').orderByKey().endAt(referenceToOldestKey).limitToLast(10).once('value').then((snapshot)=>{
var arrayOfKeys = Object.keys(snapshot.val()).sort().reverse();
var results = arrayOfKeys.map((key) => snapshot.val()[key]);
referenceToOldestKey = arrayOfKeys[arrayOfKeys.length-1];
//loop thru and append content here to desired div
})
}
但是我似乎无法让这个功能正常工作。我一直在我调用的var arrayOfKeys = Object.keys(snapshot.val()).sort().reverse();
地方得到一个空引用,它会说“对象”为空。我当前的代码(一次加载所有图像)可以在这里看到:
/*READ PIC & DATA FROM REALTIME- PICTURES*/
var database = firebase.database().ref().child('Posts/');
database.once('value', function(snapshot){
if(snapshot.exists()){
var content = '';
var counter=0;
snapshot.forEach(function(data){
var url = data.val().url;
var keyVal = data.val().keyVal;
var dimensions = data.val().dimensions;
var title = data.val().title;
var year = data.val().year;
var medium = data.val().medium;
var additional = data.val().additional;
content += '<div class="col-xl-4 col-xs-12 imageGrid" id="'+keyVal+'">';
content += '<a class="lazy example-image-link" href="'+url+'" data-title="'+title+'<br />'+medium+'<br />'+dimensions+'<br />'+year+'<br />'+additional+'<br />'+'" data-lightbox="example-1 '+counter+'"><img class="lazy example-image" width="300" height="200" src="'+url+'" alt="'+title+'"/></a>';
content += '</br><button class="btn btn-danger deleteButton logged-inX" onclick="deleteFile(this)">x</button>';
content += '<button class="btn btn-light editButton logged-inX" data-toggle="modal" data-target="#myModalUpdate" onclick="getUpdateId(this)">✎</button>';
content += '</div>';
counter++;
});
$('.displayImagesFromFirebase').append(content);
setupUI(firebase.auth().currentUser);
}
});
如果有人对如何合并这两个有任何想法,以便我最初加载 10 张图像,然后当我的用户滚动到页面底部时,我将加载接下来的 10 张图像,我将不胜感激。
更新:与 Klaycon 交谈后,我能够摆脱 null 错误。但是,现在什么都没有显示,控制台中也没有错误。你会注意到我.child('Posts')
在我的数据库参考行中添加了,这是我试图参考的数据库。我还测试了将 ('Posts') 放入 ref() 内,但无济于事。新代码如下:
var referenceToOldestKey = '';
if (!referenceToOldestKey) {
firebase.database().ref().child('Posts/').orderByKey().endAt(referenceToOldestKey).limitToLast(10).once('value').then((snapshot)=>{
if(snapshot.exists()){
var arrayOfKeys = Object.keys(snapshot.val()).sort().reverse();
var results = arrayOfKeys.map((key) => snapshot.val()[key]);
referenceToOldestKey = arrayOfKeys[arrayOfKeys.length-1];
var content = '';
var counter=0;
snapshot.forEach(function(data){
var url = data.val().url;
var keyVal = data.val().keyVal;
var dimensions = data.val().dimensions;
var title = data.val().title;
var year = data.val().year;
var medium = data.val().medium;
var additional = data.val().additional;
content += '<div class="col-xl-4 col-lg-6 col-md-6 col-xs-12 imageGrid" id="'+keyVal+'">';
content += '<a class="lazy example-image-link" href="'+url+'" data-title="'+title+'<br />'+medium+'<br />'+dimensions+'<br />'+year+'<br />'+additional+'<br />'+'" data-lightbox="example-1 '+counter+'"><img class="lazy example-image" width="300" height="200" src="'+url+'" alt="'+title+'"/></a>';
content += '</br><button class="btn btn-danger deleteButton logged-inX" onclick="deleteFile(this)">x</button>';
content += '<button class="btn btn-light editButton logged-inX" data-toggle="modal" data-target="#myModalUpdate" onclick="getUpdateId(this)">✎</button>';
content += '</div>';
counter++;
});
$('.displayImagesFromFirebase').append(content);
setupUI(firebase.auth().currentUser);
}
//loop thru and append content here to desired div
})
}
else{
firebase.database().ref().child('Posts/').orderByKey().endAt(referenceToOldestKey).limitToLast(10).once('value').then((snapshot)=>{
if(snapshot.exists()){
var arrayOfKeys = Object.keys(snapshot.val()).sort().reverse().slice(1);
var results = arrayOfKeys.map((key) => snapshot.val()[key]);
referenceToOldestKey = arrayOfKeys[arrayOfKeys.length-1];
var content = '';
var counter=0;
snapshot.forEach(function(data){
var url = data.val().url;
var keyVal = data.val().keyVal;
var dimensions = data.val().dimensions;
var title = data.val().title;
var year = data.val().year;
var medium = data.val().medium;
var additional = data.val().additional;
content += '<div class="col-xl-4 col-lg-6 col-md-6 col-xs-12 imageGrid" id="'+keyVal+'">';
content += '<a class="lazy example-image-link" href="'+url+'" data-title="'+title+'<br />'+medium+'<br />'+dimensions+'<br />'+year+'<br />'+additional+'<br />'+'" data-lightbox="example-1 '+counter+'"><img class="lazy example-image" width="300" height="200" src="'+url+'" alt="'+title+'"/></a>';
content += '</br><button class="btn btn-danger deleteButton logged-inX" onclick="deleteFile(this)">x</button>';
content += '<button class="btn btn-light editButton logged-inX" data-toggle="modal" data-target="#myModalUpdate" onclick="getUpdateId(this)">✎</button>';
content += '</div>';
counter++;
});
$('.displayImagesFromFirebase').append(content);
setupUI(firebase.auth().currentUser);
}
})
}
解决方案
推荐阅读
- python - Python - 仅剪切数据集的下降部分
- algorithm - 网络流中的“增加边缘”
- android - 我的数据没有保存在数据库中
- javascript - momentJS toNow() 和 to() 显示实际时间,而不是 1 小时或 44 分钟
- class - 通过 webpack 动态创建导出类的实例
- powershell - 将 Powershell 输出通过管道传输到文本文件
- reactjs - 有什么方法可以在反应打字稿项目中定义 addEventListener 和 classList 的类型
- excel - Excel中是否有INNER JOIN?
- sql - PostgreSQL 更新未按预期工作
- spring-boot - 从 yaml 文件中读取值