2017-09-01 8 views
2

私は、Auth /データベースとしてFirebaseを使用するAngularでIonicアプリを構築しています。Firebaseオブジェクトをフェッチしてローカルオブジェクトに等しく設定するにはどうすればよいですか?

私のアプリでは、ユーザーはさまざまなものやオブジェクトを作成できます。私はそれらのオブジェクトを取って、配列に入れます。だから私はオブジェクトの配列で終わる。ユーザーは、そのローカルリスト内のものを削除したり、変更したり、新しいものを追加することができます。

私が望むのは、(正常に保存した)オブジェクトをFirebaseにフェッチし、オブジェクトとして戻すことです。私はFirebaseを初めて使っていて、それはapiなので、ちょっと立ち往生しています。ここでFirebaseからオブジェクトを取得するために私のコードです:私はすべてのFirebaseドキュメント上で読んで、私は何snapshot.val()リターンを把握カント

fetchList() { 
    const user = this.authService.getActiveUser(); 
    if (user != null) { 
     return firebase.database().ref(user.uid + '/lists').once('value') 
      .then(snapshot => { 
       return snapshot.val(); 
      }) 
      .catch(err => { 
       return err; 
      }); 
    } 

} 

。オブジェクトや何を返しますか?そうであれば、オブジェクトのローカル配列を再構築するためにオブジェクトを解析する必要がありますか?

これはFirebaseのデータの構造例です。 0は配列インデックスです。私は基本的にオブジェクトの配列を渡し、Firebaseはこのように格納します。今、私はそれを取得し、オブジェクトの私のローカル配列にそれが等しくなるように設定したいので、ユーザは

+ Sidfnh450dfFHdh989490hdfh 
- DFjghd904hgGHdhfs9845hfh0 
    - lists 
    - 0 
     hasProperty1: false 
     isProperty2: false 
     otherProperty: 'string stuff here' 
     title: 'List Title' 
    + 1 
    + 2 

を持つことができますそれとも私が間違っている、このすべてに約つもりです。おそらく、双方向のデータバインディングに似た魔法のFirebaseメソッドが存在するかもしれません。ローカルオブジェクトアレイでFirebaseを変更しても、その逆も同様です。何かアドバイスをいただきました。

編集

また、私はローカルでやっている何かは、配列を並べ替えています。私のアプリは何らかの種類のリストであり、ユーザーはリスト内のオブジェクトを並べ替えることができます。したがって、にFirebaseとの同期リストを持っていて、誰かがリスト内のいくつかのオブジェクトを並べ替えた場合、オブジェクトベースの配列全体を削除せずに新しい配列を書き込むことなくFirebaseで並べ替える方法がわかりませんインデックス。

+0

ケニーあなたは角度2/4かAngularJSを使用していますか?もしAngular2/4が 'anglefire2' NPMパッケージを調べるならば。それはfirebaseへの統合をはるかに簡単にします。 – sketchthat

+0

3ウェイデータバインディングを使用するので、配列をローカルに格納する必要はありません。 すべてがfirebaseデータベースと同期しています。 https://github.com/angular/angularfire2 – sketchthat

+0

まあ、私はローカルでやっていることがいくつかあります。私はそれがanglefire2やfirebaseでできないと思っています。それは配列の並べ替えです。私は何かを真ん中から取り出し、いくつかのポジションを下げるかもしれません。 – Kenny

答えて

1

Firebaseにデータを保存した方法を調整した場合、あらかじめ定義された順序でデータを取り出すことができます。

追加のorderキーがリストに表示されています。

+ Sidfnh450dfFHdh989490hdfh 
- DFjghd904hgGHdhfs9845hfh0 
    - lists 
    - key1 
     hasProperty1: false 
     isProperty2: false 
     otherProperty: 'string stuff here' 
     title: 'List Title' 
     order: 1 
    + keyn 
     // ... 
     order: 2 
    + keyz 
     // ... 
     order: 3 

コンポーネント内では、リストオブジェクトのクエリでデータが順番に出てくることを要求できます。

新しい注文を保存するときは、key1key2などのキーと新しい注文をsaveOrder関数に渡すことができます。

import { AngularFireDatabase, FirebaseListObservable } from 'angularfire2/database'; 

@Component({ 
    selector: 'app', 
    templateUrl: ` 
    <ul *ngFor="let item of list | async"> 
     <li>{{ item | json }}</li> 
    </ul> 
    `, 
    styleUrls: ['./app.scss'] 
}) 
export class AppComponent implements OnInit { 
    public list: FirebaseListObservable<any[]>; 

    constructor(
    private db: AngularFireDatabase 
) {} 

    ngOnInit() { 
    this.list = this.db.list('/DFjghd904hgGHdhfs9845hfh0/list', { query: { orderByChild: 'order' }}); 
    } 

    saveOrder(key, newOrder) { 
    return this.list.update(key, { order: newOrder }); 
    } 
} 
+0

あなたの答えをありがとう。私はAngularFire2で遊んでいましたが、私はそれをすべて切り替えるつもりだと思います。最も難しい課題は、リストの並べ替え(基本的にドラッグアンドドロップ)をFirebaseに反映させることでした。しかし、あなたの答えは正しいです。データを別に保存する必要があります。 :) – Kenny

+0

強くお勧めします。また、https://github.com/firebase/boltを参照すると、データベースの管理がはるかに簡単になります。 – sketchthat

関連する問題