2017-07-04 3 views
0

Ich beginne gerade mit angularFire2. Ich habe einige Firebase Daten wie folgt strukturiert:Abrufen von Werten aus mehreren Schlüsseln in Firebase mit AngularFire2

{ 
    "user-friends": { 
     "-userkey1": { 
      "-userkey2": true, 
      "-userkey3": true 
     } 
    }, 

    "users": { 
     "-userkey1": { 
      "uid": "id1", 
      "uname": "Jim Yu" 
     }, 
     "-userkey2": { 
      "uid": "id2", 
      "uname": "Bob Smith" 
     }, 
     "-userkey3": { 
      "uid": "id3", 
      "uname": "Jane Doe" 
     } 
    } 
} 

Bisher habe ich die Daten in user-friends Knoten für -userkey1 abrufen kann, die

"-userkey1": { 
     "-userkey2": true, 
     "-userkey3": true 
    } 

Dann kehrt Ich möchte die uname erhalten können, von jeder Schlüssel, und speichern Sie das in einer Variablen, die an die Ansicht gebunden werden würde.

Ich bin mir nicht ganz sicher, wie ich diesen letzten Schritt konkret mit angularFire2..oder wenn es eine eckige/firebase-spezifische Methode/Hilfsmethode zur Lösung dieses Problems gibt.

so weit ist es das, was ich habe jedoch einmal I Schleife durch jede Taste und versuchen, den Benutzernamen in eine Anordnung zu schieben, die Konsole, um die ersten Tasten protokolliert uname aber dann schreit cannot read property 'push' of undefined

userFriends(userkey: string){ 
    console.log("userKey=" + userkey) 
    var getUsrFriends = this.afDB.list("https://myfirebaseurl.com/user-friends/" + userkey 
    ).subscribe(data => { 
     data.forEach(friendKey => { 
      console.log(friendKey.$key) //my instinct tells me looping through the keys and storing in an array is not a optimal solution 
      var getUserInfo = this.afDB.object("https:/myfirebaseurl.com/users/" + friendKey.$key, { 
      }).subscribe(u => { 
       console.log(u.uname) 
       this.friendsList.push(u.uname) // <- undefined error 
      })  
     });  
    }) 
} 

<ng-container *ngIf="showView == 'friend'"> 
    <ion-list *ngFor="let friend of friendsList"> 
     <h3>{{friend}}</h3> 
    </ion-list> 
</ng-container> 

EDIT: Der undefinierter Fehler wurde tatsächlich verursacht, indem das Array friendsList nicht ordnungsgemäß initialisiert wurde.

export class UserPage { 
    friendsList: string[] = [] 
// constructor, etc 
} 

Antwort

1

Firebase ist wirklich schnell, also mehrere Anrufe zu machen ist nicht so schlecht.

Ihre aktuelle Datenstruktur verwendet, wird dieser Code funktioniert:

// Outside firebase calls 
let scope = this; 

... 
var getUserInfo = this.afDB.object("https:/myfirebaseurl.com/users/" + friendKey.$key, {}).take(1).subscribe(u => { 
    console.log(u.uname) 
    scope.friendsList.push(u.uname) // <- undefined error 
}) 
... 

this, einmal in der Firebase Versprechen von diesem Versprechen ist reserviert und etwas anderes bedeuten als die regelmäßig reserviert this des globalen Komponente Variablen.

Verwenden Sie auch take(1) vor dem Abonnieren, weil Sie diese Werte nur einmal abrufen und nicht weiterhören möchten.

Eine alternative Methode wäre, Ihre Datenbank neu zu strukturieren, um schnellere Abfragen in einem Kompromiss für mehr Datenspeicher zu machen. Anstatt nur die Benutzerreferenz in user-friends zu speichern, können Sie die ganze user speichern. Aber ich würde die erste Option empfehlen.

+0

Dank @theblindprophet. Ich erkannte auch, dass ich Freunde Array nicht richtig initialisiert hatte. Ich hatte nur den Typ erklärt. – gregdevs

Verwandte Themen