tl; dr Performing impaginazione di base Firebase via startAt
, endAt
e limit
è terribilmente complicato, ci deve essere un modo più semplice.impaginazione cronologicamente ordine di priorità i bambini Firebase
Sto costruendo un'interfaccia di amministrazione per un numero elevato di invii di utenti. La mia idea iniziale (e attuale) è di recuperare semplicemente tutto ed eseguire la paginazione sul client. Vi è tuttavia un ritardo notevole quando si recuperano più di 2000 record (contenenti 5-6 piccoli numeri/campi di stringhe ciascuno) che attribuisco a un carico di dati di oltre 1,5 MB.
Attualmente tutte le voci vengono aggiunte tramite push
ma sono un po 'perso per quanto impaginato attraverso l'enorme elenco.
a prendere la prima pagina di dati che sto utilizzando endAt
con una limit
5:
ref.endAt().limit(10).on('child_added', function(snapshot) {
console.log(snapshot.name(), snapshot.val().name)
})
che si traduce nella seguente:
-IlNo79stfiYZ61fFkx3 #46 John
-IlNo7AmMk0iXp98oKh5 #47 Robert
-IlNo7BeDXbEe7rB6IQ3 #48 Andrew
-IlNo7CX-WzM0caCS0Xp #49 Frank
-IlNo7DNA0SzEe8Sua16 #50 Jimmmy
In primo luogo per capire quante pagine ci sto mantenendo un contatore separato che viene aggiornato ogni volta che qualcuno aggiunge o rimuove un record.
In secondo luogo dal momento che sto usando push
non ho modo di navigazione verso una pagina specifica in quanto non conosco il nome dell'ultimo record per una pagina specifica che significa un'interfaccia come questo non è possibile:
Per semplificare, ho deciso di passare semplicemente ai pulsanti Avanti/Indietro, ma questo presenta anche un nuovo problema; se uso il nome del primo record nel precedente set di risultati posso impaginare alla pagina successiva utilizzando il seguente:
ref.endAt(null, '-IlNo79stfiYZ61fFkx3').limit(5).on('child_added', function(snapshot) {
console.log(snapshot.name(), snapshot.val().name)
})
Il risultato di questa operazione è la seguente:
-IlNo76KDsN53rB1xb-K #42 William
-IlNo77CtgQvjuonF2nH #43 Christian
-IlNo7857XWfMipCa8bv #44 Jim
-IlNo78z11Bkj-XJjbg_ #45 Richard
-IlNo79stfiYZ61fFkx3 #46 John
Ora Ho la pagina successiva, tranne che è spostata di una posizione, il che significa che devo regolare il mio limite e ignorare l'ultimo record.
Per tornare indietro di una pagina Dovrò mantenere un elenco separato sul client di ogni record che ho ricevuto finora e capire quale nome passare a startAt
.
C'è un modo più semplice per farlo o dovrei semplicemente tornare a recuperare tutto?
Grazie, offset() e count() risolveranno tutti i problemi di impaginazione. –
Qualsiasi aggiornamento su quando queste funzionalità saranno rilasciate per l'API JavaScript - In particolare con il supporto per i collegamenti AngularFire? –
+1 per la domanda da @DanKanze. Sarebbe fantastico, specialmente per AngularFire. – Jake