2013-01-20 29 views
5

tl; dr Performing pagination cơ bản trong căn cứ hỏa lực qua startAt, endAtlimit là terribly phức tạp, phải có một cách dễ dàng hơn.paginating thứ tự thời gian ưu tiên trẻ em căn cứ hỏa lực

Tôi đang xây dựng một giao diện quản trị cho một số lượng lớn các bản đệ trình người dùng. Ý tưởng ban đầu (và hiện tại) của tôi là đơn giản tìm nạp mọi thứ và thực hiện phân trang trên máy khách. Tuy nhiên, có một sự chậm trễ đáng chú ý khi tìm nạp hơn 2000 bản ghi (có chứa 5-6 trường số/chuỗi nhỏ) mà tôi gán cho một tải trọng dữ liệu trên 1,5mb.

Hiện tại tất cả các mục nhập được thêm qua push nhưng tôi bị mất một chút về cách phân trang thông qua danh sách lớn.

Để lấy trang đầu tiên của dữ liệu Tôi đang sử dụng endAt với một limit 5:

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

mà kết quả trong những điều sau đây:

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

Trước hết để tìm ra bao nhiêu trang có Tôi đang giữ một bộ đếm riêng biệt được cập nhật bất cứ khi nào ai đó thêm hoặc xóa một bản ghi.

Thứ hai kể từ khi tôi đang sử dụng push tôi không có cách nào điều hướng đến một trang cụ thể vì tôi không biết tên của hồ sơ qua cho một trang cụ thể có nghĩa là một giao diện như thế này không phải là hiện nay có thể:

Standard pagination controls

Để đơn giản hơn, tôi đã quyết định chỉ đơn giản là có các nút tiếp theo/trước đó, tuy nhiên điều này cũng trình bày một vấn đề mới; nếu tôi sử dụng tên của bản ghi đầu tiên trong kết quả-thiết lập trước đó tôi có thể đánh số trang đến trang tiếp theo bằng cách sử dụng sau đây:

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

Kết quả của hoạt động này là như sau:

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

Bây giờ Tôi có trang tiếp theo, ngoại trừ việc chuyển một vị trí có nghĩa là tôi phải điều chỉnh giới hạn của mình và bỏ qua bản ghi cuối cùng.

Để di chuyển trở lại một trang, tôi sẽ phải giữ một danh sách riêng biệt trên ứng dụng khách của mọi bản ghi mà tôi đã nhận được cho đến thời điểm này và tìm ra tên cần chuyển đến startAt.

Có một cách dễ dàng hơn để làm điều này hay nên tôi chỉ quay trở lại để lấy tất cả mọi thứ?

Trả lời

7

Chúng tôi đang làm việc trên thêm một "bù đắp()" truy vấn để cho phép dễ dàng pagination. Chúng tôi cũng sẽ thêm một điểm cuối đặc biệt để cho phép bạn đọc số lượng trẻ em tại một địa điểm mà không thực sự tải chúng từ máy chủ.

Cả hai sẽ mất một chút mặc dù. Trong khi chờ đợi, phương pháp bạn mô tả (hoặc thực hiện tất cả trên máy khách) có lẽ là cách tốt nhất của bạn.

Nếu bạn có một cấu trúc dữ liệu đó là append-chỉ, bạn có thể có khả năng cũng làm pagination khi bạn viết dữ liệu. Ví dụ: đặt 50 đầu tiên vào/page1, đặt 50 thứ hai trong/page2, v.v.

+2

Cảm ơn, offset() và count() sẽ giải quyết tất cả các vấn đề về phân trang. –

+0

Mọi cập nhật về thời điểm các tính năng này sẽ được phát hành cho API JavaScript - Cụ thể với sự hỗ trợ cho các ràng buộc AngularFire? –

+0

+1 cho câu hỏi từ @DanKanze. Điều này sẽ là tuyệt vời, đặc biệt là cho AngularFire. – Jake

4

Một cách khác để thực hiện điều này là với hai cây:

Tree of ids: { id1: id1, id2: id2, id3: id3 }

Tree of data: { id1 : ..., id2: ..., id3: ... }

sau đó bạn có thể tải toàn bộ cây của id (hoặc một đoạn lớn của nó) cho khách hàng, và làm pagination ưa thích với tr đó ee của id.

2

Đây là bản hack để phân trang theo từng hướng.

// 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) 

Về cơ bản, đó là bản hack cho startAtExclusive(). Bạn có thể bất cứ điều gì đến cuối id.

Cũng đã tìm ra endAtExclusive() để quay lại.

// 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)... 

Sẽ chơi với một số thứ khác nhưng có vẻ như hoạt động với các id đẩy. Thay thế giới hạn bằng limitToFirst hoặc limitToLast nếu sử dụng truy vấn firebase.

Các vấn đề liên quan