2017-07-04 22 views
0

我剛剛開始使用angularFire2。我有結構化的一些火力地堡數據如下:使用AngularFire2從Firebase中的多個鍵檢索值

{ 
    "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" 
     } 
    } 
} 

到目前爲止,我可以在user-friends節點-userkey1,返回

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

然後,我希望能夠得到uname的檢索數據每個鍵,並將其存儲在一個將綁定到視圖的變量中。

我有點不確定如何去專門使用angularFire2 ..或如果有一個角/ firebase特定的方法/輔助方法來解決這個問題。

到目前爲止,這是我,但一旦通過每個關鍵我環路,並嘗試將用戶名推到一個數組中,控制檯日誌第一項uname但隨後尖叫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> 

編輯:未定義的錯誤實際上是由於未正確初始化friendsList陣列造成的。

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

回答

1

Firebase非常快速,所以多次調用並不算太壞。

使用當前的數據結構,這個代碼將工作:

// 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,一旦進入火力地堡承諾由承諾保留和手段保留全局變量組成的this東西比經常不同。

此外,在訂閱之前使用take(1),因爲您只想檢索一次這些值而不想繼續收聽。


另一種方法是重構您的數據庫,以在更多數據存儲的折衷中進行更快的查詢。您可以將整個user存儲在user-friends中,而不是隻存儲用戶參考。但我會建議第一個選項。

+0

謝謝@theblindprophet。我也意識到我沒有正確初始化friendsList數組。我只是宣佈了這種類型。 – gregdevs

相關問題