2017-10-10 82 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

是的,我會嘗試。謝謝,但可能有更好的解決方案。如果你發現它,請編輯答案.... :) –