2017-08-05 1 views
1

Je veux créer un leaderboard dans mon application.Alors j'ai besoin de lire les informations sur les noms et totalscores de la base de données Firebase et les afficher sur le navigateur. Mon but est d'afficher quelque chose comme ça sur le navigateur mais remplacez l'Inconnu par des noms d'utilisateurs et des topscores de base de données bien sûr.Angular4 Firebase FirebaseListObservable indice de contrôle à afficher sur html

Leaderboard

  • Première: Inconnu, Topscore: Inconnu
  • Second: Inconnu, Topscore: Inconnu
  • Troisième: Inconnu, Topscore: Inconnu
  • Quatrième: Unknown, Topscore: Inconnu
  • Cinquième: Inconnu, Topscore: Inconnu
  • Ma base de données est firebase:

    "users" : { 
        "Test1" : { 
         "totalscore" : 50, 
         "username" : "test1" 
        }, 
        "Test2" : { 
         "totalscore" : 30, 
         "username" : "test2" 
        }, 
        "Test3" : { 
         "totalscore" : 20, 
         "username" : "test1" 
        }, 
        "Test4" : { 
         "totalscore" : 10, 
         "username" : "test1" 
        }, 
        "Test5" : { 
         "totalscore" : 50, 
         "username" : "test1" 
        }, 
        "Test6" : { 
         "totalscore" : 30, 
         "username" : "test2" 
        }, 
        "Test7" : { 
         "totalscore" : 20, 
         "username" : "test1" 
        }, 
        "Test8" : { 
         "totalscore" : 10, 
         "username" : "test1" 
        } 
        } 
    

    Avec le code suivant je peux obtenir l'information inversée de ce que je veux.

    topusers: FirebaseListObservable<any>; 
        constructor(db: AngularFireDatabase) { 
    
    
         this.topusers = db.list('users', { 
         query: { 
         orderByChild: "totalscore", 
         limitToLast: 10, 
         } 
         }); 
        } 
    

    Dernière utilisation de * ngFor Je peux afficher les 5 topscores de la cinquième à la première.

    <ul *ngFor="let topuser of topusers | async"> 
        <li class = "white" > 
         {{ topuser.username | json }}: 
         {{ topuser.totalscore | json }}   
        </li> 
    </ul> 
    

    Ma question est que est-il possible de contrôler le * ngFor donc au lieu de commencer par le premier indice de la liste à partir de la dernière et se termine le premier ?? Ou est-ce que je peux contrôler l'index de FirebaseListObservable que je veux afficher sur le navigateur?

    +2

    Vous pouvez essayer d'ajouter une fonction de carte à l'observable pour inverser l'ordre de retour. .map (res => res.reverse()) – LLai

    Répondre

    1

    Vous ne voulez pas nécessairement manipuler l'ordre du ngFor, mais manipulez plutôt les données transmises dans le ngFor. Vous pouvez inverser l'ordre des données renvoyées par l'observable firebase avec la méthode .map

    topusers: Observable<any>; // use Observable<> instead of FirebaseListObservable<> since .map is an rxjs method that returns the type Observable 
    
    constructor(){ 
        this.topusers = db.list('users', { 
         query: { 
          orderByChild: "totalscore", 
          limitToLast: 10, 
         } 
        }) 
        .map(res => res.reverse()); 
    } 
    

    Alors maintenant, le réseau étant passé à l'ngFor est inversée.

    +0

    Merci pour la réponse .. mais quand j'utilise '.map (res => res.reverse());' sur la fonction j'obtiens une erreur dans this.users en disant * * [ts] Le type 'Observable ' n'est pas assignable au type 'FirebaseListObservable '. La propriété '$ ref' est manquante dans le type 'Observable '. ** J'importe 'import {Observable} de 'rxjs/Rx';' utiliser la carte à droite ?? – Zekelonas

    +1

    @Zekelonas vous voudrez importer la fonction de carte. importer 'rxjs/add/operator/map'; – LLai

    +0

    Je reçois toujours la même erreur sur this.users 'Type 'Observable ' n'est pas assignable pour taper 'FirebaseListObservable '. La propriété '$ ref' est manquante dans le type 'Observable ' .' – Zekelonas