tl; dr Performing pagination cơ bản trong căn cứ hỏa lực qua startAt
, endAt
và limit
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ể:
Để đơ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ứ?
Cảm ơn, offset() và count() sẽ giải quyết tất cả các vấn đề về phân trang. –
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? –
+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