2017-11-14 11 views
0

私はAngular 4とFirebase Realtime DBを使ってゲームを構築しています。私はこの例では、特定の選手、ジョーにFirebaseObjectObservableを作成したいのですが私のアプリでFirebaseListObservableクエリから単一のFirebaseObjectObservableを返す方法

FB -> player_list-> -KyagqWEM-cqUoppGe_x 
         id:33061 
         name:Joe 
        -KyadrWSD-aqUeedBv_w 
         id:22037 
         name:Cara 

:私はこのようなFirebase DBのレイアウトを持っています。私の呉データベースサービスでは、私はこのようになります方法作成しました:

getPlayerFromId(playerId: number): FirebaseListObservable<Player[]> { 
    this.player = this.database.list(this.playerBasePath, { 
    query: { 
     orderByChild: 'id', 
     equalTo: playerId, 
     limitToFirst: 1 
    } 
    }) 
    return this.player; 
} 

クエリを私のFirebaseデータベース内の特定のノードを検索するための最良の方法であると思われる、残念なことにクエリは、リストのみを返すように見えますたとえそのリストが長さが1つの項目であっても。私のコンポーネントでは、このようなコードで、一人のプレイヤーオブジェクトを取得するにはかなり簡単です:

getPlayer(playerId: number){ 
    this.studentService.getPlayerFromId(playerId) 
    .subscribe(data => { 
     this.player = data[0]; 
    }) 
    } 

リストクエリから1 FirebaseObjectObservableを返すために、よりエレガントな方法はありますか?私はマップとフィルターを試しましたが、明らかにFirebaseListObservableでサポートされていません。

答えて

0

返された結果は、オブジェクト

getPlayer(playerId: number){ 
this.studentService.getPlayerFromId(playerId) 
.subscribe(data => { 
    data.forEach(player => { 
    this.player = player; 
    }) 

}) 
} 

チェックこのanswer

0
Try with forEach but as this.player will get its data asynchronously from firebase 

this.player= this.af.database.list(this.playerBasePath); 
     this.player.forEach(element => { 
      console.log(element); 
     }); 

    Above code you will be iterating before the data actually there. So for this 
    you can add the option 


    preserveSnapshot: true 

     this.studentService.getPlayerFromId(playerId, { preserveSnapshot: true}) 
      .subscribe(snapshots=>{ 
       snapshots.forEach(snapshot => { 
        console.log(snapshot.key, snapshot.val()); 
       }); 
      }) 
を取得するためにをループに必要なリストであるため、
関連する問題