2016-07-08 12 views
12

現在、Angular 2とangularFire2のプロジェクトで作業中です。 私のデータベースはFirebaseに次のようになります。 ベース:/データAngular2、angularfire2、Typescriptを持つFirebaseオブジェクトからデータを取得する

[{Name:test1}, 
{Name:test2}, 
{Name:test3}] 

項目のすべてもFirebaseキーを持っています。

RXのObservabelsでFirebaseからデータを取得しようとしています。私はこれを行うと は、私は、コンソールで名前を取得:

let items= af.database.list('/data').map(i=>{return i}); 
items.forEach(i=>i.forEach(e=>(console.log(e.name)))); 

出力:test1の、TEST2、TEST3。すべてが動作します。

しかし、私はこれを行うとき:

console.log(items.first()); 

を私はFirebaseListObservableを取り戻します。

FirebaseListObservableから最初のオブジェクトだけを取得するにはどうすればよいですか? リスト内のアイテムを編集するにはどうすればよいですか?以下のような:

items[0].name=test3 

と私は項目からFirebaseキーを取得できますか

どのように私は、リスト内の項目からfirebaseKeyを得ることができますか?

答えて

16

Observablesは、あなたが実際にデータが利用可能になるだろうされている場合、あなたはObservableに加入する必要があります知っているとのデータがnextハンドラ内で使用可能になるのを待たないことを意味し、非同期データ構造です。

items.first().subscribe(x => console.log(x.name)); 

さらに、Observableは静的ではありませんので、あなたのようなそれへのインデックスすることはできません。最初の項目だけが必要な場合は、値を抽出してflatMap + first + mapの組み合わせで値を変更することをお勧めします。

af.database.list('/data') 
    //Convert array into Observable and flatten it 
    .flatMap(list => list) 
    //Get only the first item in this list 
    .first() 
    //Transform the value 
    .map(({name, firebaseKey}) => ({name: "test3", firebaseKey})) 
    //Subscribe to the stream 
    .subscribe(x => console.log(x)); 
+1

本当に助かりました。 – jufabeck2202

+0

大歓迎です! – paulpdaniels

+0

最初のアイテムだけでなく、アイテムをループしたい場合はどうすればいいですか? – Lloyd

関連する問題