0

Je suis en train de les éléments de charge Firebase paresseux plus tard de la charge plusieurs d'entre eux à chaque fois que l'utilisateur atteint la fin du conteneur div. Quand je supprimer .endAt() et .startAt() je reçois les 15 articles si elles ne sont pas beeing incrémentée et il est coincé à ces 15 articles.charge Firebase paresseux

Quand je garder .endAt() et .startAt() je reçois avertissement Using an unspecified index. Consider adding ".indexOn": "title" at /items firebase même si .indexOn est réglé. Je suis confus par cet avertissement. Merci d'avance pour votre aide.

Structure Firebase

{ 
    "items" : { 
    "-Kk6aHXIyR15XiYh65Ht" : { 
     "author" : "joe", 
     "title" : "Product 1" 
    }, 
    "-Kk6aMQlh6_E3CJt_Pnq" : { 
     "author" : "joe", 
     "title" : "Product 2" 
    } 
    }, 
    "users" : { 
    "RG9JSm8cUndpjMfZiN6c657DMIt2" : { 
     "items" : { 
     "-Kk6aHZs5xyOWM2fHiPV" : "-Kk6aHXIyR15XiYh65Ht", 
     "-Kk6aMTJiLSF-RB3CZ-2" : "-Kk6aMQkw5bLQst81ft7" 
     }, 
     "uid" : "RG9JSm8cUndpjMfZiN6c657DMIt2", 
     "username" : "joe" 
    } 
    } 
} 

Règles de sécurité

{ 
    "rules": { 
    ".read": true, 
    ".write": "auth != null", 
    "users":{ 
     "$uid": { 
     ".write": "$uid === auth.uid" 
     "items":{ 
      ".indexOn": "title", 
      "$itemId": { 
      "title": {".validate": "...} 
      "type": {".validate": "...} 
      } 
      } 
     } 
     } 
    } 
    } 
} 

structure de code pour la charge paresseuse

let _start = 0, 
    _end = 14, 
    _n = 15; 

function lazyLoadItems(){ 
    firebase.database().ref('items') 
     .orderByChild('title') 
     .startAt(_start) 
     .endAt(_end) 
     .limitToFirst(_n) 
     .on("child_added", snapshot=> console.log(snapshot.val())); 
    _start += _n; 
    _end += _n; 
} 
+0

Vous vous interrogez '/ points'une, alors que vous avez ajouté un index'/utilisateurs/$ uid/points'une. –

+0

Hmm, oui, bien que je veuille lister tous les éléments de tous les utilisateurs, donc demander '/ users/$ uid/items' sans' uid' ne fera pas l'affaire. Et ajouter '.indexOn ('items')' dans '' rules ''n'a pas de sens. Cela pourrait-il être des règles mal structurées alors? – nehel

+0

C'est impossible à dire avec ce que vous avez partagé. Un extrait minimal du JSON pourrait aider. Vous pouvez obtenir cela en cliquant sur le lien "Export JSON" dans votre [Firebase Database console] (https://console.firebase.google.com/project/_/database/data). –

Répondre

1

Vous avons mal compris comment fonctionnent les requêtes Firebase. Il est plus facile de voir si vous utilisez des valeurs codées en dur:

firebase.database().ref('items') 
    .orderByChild('title') 
    .startAt(0) 
    .endAt(14) 
    .limitToFirst(15) 

Il n'y a aucun élément avec title=0 ou title=14, de sorte que la requête ne correspond pas à quoi que ce soit.

Firebase requêtes de base de données correspondent à la valeur de la propriété que vous commandez sur. Ainsi, lorsque vous commandez par title les valeurs que vous spécifiez dans startAt et endAt doivent être des titres. Par exemple.

ref.child('items') 
    .orderByChild('title') 
    .startAt("Product 1") 
    .endAt("Product 1") 
    .limitToFirst(15) 
    .on("child_added", function(snapshot) { console.log(snapshot.val()); }); 

Voir pour l'échantillon de travail de celle-ci: http://jsbin.com/hamezu/edit?js,console

Pour mettre en œuvre la pagination, vous devez vous rappeler le dernier élément de la page précédente et passer que pour le prochain appel: startAt(titleOfLastItemOnPreviousPage, keyOfLastItemOnPreviousPage).

+0

Ooooh qui a du sens maintenant. Encore nouveau au monde NoSQL bien que cela clarifie tout! – nehel