负载更多的数据使用ENDAT
问题描述:
我使用limitToLast(5)
如下最初装载从我的数据库节点中的最后5个项目:负载更多的数据使用ENDAT
var myData = [];
var firstKey;
var fetchInitialData(category){
firebase.database().ref(category).orderByKey().limitToLast(5).once('value' , function(snap){
addDatToArray(snap);
});
}
fetchInitialData('myCategory');
var addDatToArray = function(snap){
snap.forEach(function(child){
myData.push(child.val());
if(!firstKey){
firstKey = child.key;
}
});
}
我有一个负载更多按钮,取5个项目并将其推向myData[]
。因为我存储在最初的firstKey
取我把它传递给endAt()
如下:
var fetchMoreData(category){
firebase.database().ref(category).orderByKey().endAt(firstKey).limitToLast(5).once('value' , function(snap){
firstKey = null;
addDatToArray(snap);
});
}
它工作正常,但问题是,因为我获取更多使用endAt()
和endAt()
限制数据包括在结束的项目品脱也。因此,对于每载入更多数据,myData
阵列中的一项重复。
是描述考虑folowimg例如:
我的数据结构
----category
--item1
--item2
--item3
--item4
--item5
--item6
--item7
--item8
--item9
--item10
1.初始取我中读取最后5个项目它们是项6-10和firstKey
设置为item6
。显示给用户 项是
item6
item7
item8
item9
item10
2.上装载更多取firstKey
这是item6
被传递到endAt()
并且由于endAt()
是包容性的,也取item6
并将其推到显示给myData[]
项用户是
item6
item7
item8
item9
item10
item5
item4
item3
item2
item6//fetched again
如何解决这个问题
答
将数据添加到数组时,如果它与您的endAt查询的键匹配,您可以忽略该子项?所以,你的addDatToArray
方法将多花费一个参数,如:
var addDatToArray = function(snap, ignoreKey){
snap.forEach(function(child){
if(child.key != ignoreKey) {
myData.push(child.val());
}
if(!firstKey){
firstKey = child.key;
}
});
}
从firebase.database.Query#endAt文档:
的结束点是包容性的,所以用完全相同的规定值的孩子将被列入查询。
因此,您需要通过+1调整limitToLast
来解决此问题,然后丢弃重复的结果。
好主意,但这将技术性地意味着我fetchimg只有4而不是5 ...我想要5个项目取到 –
我看,我想你可以使用'limitToLast(6)''fetchMoreData'方法来得到一个更多的结果? – Grimthorr
是的,我会尝试。谢谢,但可能有更好的解决方案。如果你发现它,请编辑答案.... :) –