2017-10-10 81 views
1

我使用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 

如何解决这个问题

回答

1

将数据添加到数组时,如果它与您的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来解决此问题,然后丢弃重复的结果。

+0

好主意,但这将技术性地意味着我fetchimg只有4而不是5 ...我想要5个项目取到 –

+1

我看,我想你可以使用'limitToLast(6)''fetchMoreData'方法来得到一个更多的结果? – Grimthorr

+0

是的,我会尝试。谢谢,但可能有更好的解决方案。如果你发现它,请编辑答案.... :) –