2013-01-20 28 views
5

TL;博士表演在火力地堡基本分頁通過startAtendAtlimit是非常複雜的,必須有一個更簡單的方法。分頁按時間順序優先火力地堡孩子

我正在構建大量用戶提交的管理界面。我最初的(當前)想法是簡單地獲取所有內容並在客戶端上執行分頁。但是,當獲取超過2000個數據有效載荷的超過2000條記錄(每個包含5-6個小數字/字符串字段)時,會有一個明顯的延遲。

目前所有的條目都通過push添加,但我有點失去了如何通過龐大的列表分頁。

要使用5的limit取我使用endAt數據的第一頁:

ref.endAt().limit(10).on('child_added', function(snapshot) { 
    console.log(snapshot.name(), snapshot.val().name) 
}) 

其結果如下:

-IlNo79stfiYZ61fFkx3 #46 John 
-IlNo7AmMk0iXp98oKh5 #47 Robert 
-IlNo7BeDXbEe7rB6IQ3 #48 Andrew 
-IlNo7CX-WzM0caCS0Xp #49 Frank 
-IlNo7DNA0SzEe8Sua16 #50 Jimmmy 

首先要弄清楚多少頁有我是否保留一個單獨的計數器,每當有人添加或刪除記錄時都會更新。

其次,因爲我使用的是push我沒有導航到一個特定的頁面,因爲我不知道最後記錄的名稱爲特定頁面意義的接口方式是這樣,目前不可能:

Standard pagination controls

爲了使它更簡單,我決定只是簡單地有下一個/上一個按鈕,但這也帶來了一個新問題;如果我在以前的結果集使用的第一條記錄的名字我可以使用分頁到下一頁以下:

ref.endAt(null, '-IlNo79stfiYZ61fFkx3').limit(5).on('child_added', function(snapshot) { 
    console.log(snapshot.name(), snapshot.val().name) 
}) 

這種操作的結果如下:

-IlNo76KDsN53rB1xb-K #42 William 
-IlNo77CtgQvjuonF2nH #43 Christian 
-IlNo7857XWfMipCa8bv #44 Jim 
-IlNo78z11Bkj-XJjbg_ #45 Richard 
-IlNo79stfiYZ61fFkx3 #46 John 

現在我有下一頁,除了它被移動了一個位置,這意味着我必須調整我的限制並忽略最後一個記錄。

要退回一頁,我將不得不在我到目前爲止收到的每條記錄的客戶端上保留一個單獨的列表,並確定要傳遞給startAt的名稱。

有沒有這樣做的更簡單的方法,或者我應該回去抓取所有東西?

回答

7

我們正在努力增加一個「偏移()」查詢以便於分頁。我們還將添加一個特殊的端點,以便您可以讀取某個位置的兒童數量,而無需從服務器實際加載它們。

這兩種情況都需要考慮一下。與此同時,您描述的方法(或者全部在客戶端上完成)可能是您最好的選擇。

如果您有一個只附加數據的數據結構,那麼您在編寫數據時也可能會執行分頁。例如:將第一個50放在/ page1中,將第二個50放在/ page2中,等等。

+2

謝謝,offset()和count()將解決所有分頁問題。 –

+0

有關JavaScript API何時發佈這些功能的更新 - 特別支持AngularFire綁定? –

+0

對於來自@DanKanze的問題+1。這非常棒,特別是對於AngularFire。 – Jake

4

另一種方式來做到這一點是有兩棵樹:

樹的id:{ ID1:ID1, ID2:ID2, ID3:ID3 }

樹的數據:{ ID1 :......, ID2:..., ID3:... }

然後,您可以加載ID的整個樹(或它的一大塊)到客戶端,並且不與分頁花哨那個tr ids的ee。

2

這裏是對每個方向分頁的破解。

// get 1-5 
ref.startAt().limit(5) 

// get 6-10 from 5 
ref.startAt(null, '5th-firebase-id' + 1).limit(5) 

// get 11-15 from 10 
ref.startAt(null, '10th-firebase-id' + 1).limit(5) 

基本上它是一個破解startAtExclusive()。你可以任何事情結束的ID。

也計算出endAtExclusive()倒退。

// get 6-10 from 11 
ref.endAt(null, '11th-firebase-id'.slice(0, -1)).limit(5)... 

// get 1-5 from 6 
ref.endAt(null, '6th-firebase-id'.slice(0, -1)).limit(5)... 

將玩這個更多,但似乎與推ids工作。如果使用Firebase查詢,請用limitToFirstlimitToLast取代限制。