2016-11-14 12 views
2

Firebaseで多対多リレーションシップを扱うことについての質問があります。基本的には、Firebaseデータ内の複数のパスからユーザプロファイルオブジェクトを構築しようとしています。私は、observableを返す関数を構築しようとしました。そして、そのobservableのデータをFirebaseからのネストされた観測可能なグラブデータとして更新します。AngularFire2 - ネストされたFirebaseObjectObservableはネストされたFirebaseコールを起動しません

問題は、ネストされたオブザーバブルが、私が理解できるものから呼び出されないことです。私はこれに対して数時間何か本当の成功なしに頭を打ってきた。誰かが私が間違っていることを伝えることはできますか?私はこれが解決される非常に一般的な問題だと思います。

public getUserProfile(data) { 

    return this._af.database.object(`/social/users/${data.id}`).map((user) => { 
     for (let vidKey in user.videos) { 

      // Once the code hits this line, it never fires at all :(
      this._af.database.object(`/social/videos/${vidKey}`).map((video) => { 
       user.videos[vidKey] = video; 
      }); 
     } 
     return user; 
    }); 
} 

答えて

5

ネストされたオブザーバブルは決してサブスクライブされないため呼び出されません。オブザーバブルはレイジーです。

あなたは代わりに、このような何かを行うことができます:

public getUserProfile(data) { 

    return this._af.database 
    .object(`/social/users/${data.id}`) 

    // Switch to the joined observable 

    .switchMap((user) => { 

     let vidKeys = Object.keys(user.videos); 

     // Use forkJoin to join the video observables. The observables will 
     // need to complete, so first is used. And use forkJoin's selector to 
     // map the videos to the user and then return the user. 

     return Observable.forkJoin(
     vidKeys.map((vidKey) => this._af.database 
      .object(`/social/videos/${vidKey}`) 
      .first() 
     ), 
     (...videos) => { 
      vidKeys.forEach((vidKey, index) => { user.videos[vidKey] = videos[index] }); 
      return user; 
     } 
    ); 
    }); 
} 
+0

cartantを、あなたは絶対最高です。私は、これが、私がやっているいくつかの異なる "参加型"のために、この種の機能をたくさん再利用するインスタンスの1つであることを認識しました。これは完全に動作し、実際にそれを行う簡潔な方法を紹介します:)乾杯! –

+0

実際には私は興味がありました:UIが自動的にビデオの詳細を変更して、別の場所に変更した場合、Firebaseデータベースの各ビデオの購読を使用するには、この作業をやり直す必要がありますか?現在のバージョンでは、ビデオデータは一度だけ読み込まれますが、データベースで更新されていれば更新されません。私は、同じ機能をユーザー間のメッセージ集約や、異なる投稿のフィードに使用したいと考えています。 –

+0

うん、あなたはそれを変更する必要があります。答えのコードは、ユーザーが変更した場合にのみ再発行されます。変更があったときに再度発光したい場合は、 'forkJoin'の代わりに' combineLatest'を使うことができます。そして、 'first'演算子も削除してください。 – cartant

関連する問題