2017-07-04 57 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

相关问题