2017-01-28 16 views
1

私はAngular2のプロジェクトで作業しており、RxJSの機能(およびFirebaseはバックエンド)を備えた非常に動的なユーザーインターフェイスをたくさん作成しようとしています。サービスからswitchMapで観測値を返すと、配列にラップされた戻り値が返されます

今すぐ次のシナリオを取る:

this.af.auth 
    .filter(Boolean) 
    .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid)); 

ユーザーが正しくので、保存されたユーザ情報を取得するために、内側に観察に切り替えにしている場合ログインしている場合、これは他(例えば、管理プロパティをチェックします)

これはうまくいきます(テンプレートではsubscribe()とasyncパイプの両方)。

私は、observableを専用のサービスに移動して取得しようとすると、観測可能な「ラップされた」配列を返します。

// in original component 
let userObservable = this.databaseSrv.getUserObservable(); // the userObservable will be wrapped as an Array and the component logic breaks 

// in database-service 
getUserObservable(){ 
    return this.af.auth 
    .filter(Boolean) 
    .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid)); 
} 

私は私が観察を返す方法と間違って何かが確かにそこにある...マップ/ flatmap /マージでさまざまなバリエーションを試してみましたが、私はそれのまわりで私の頭を包むように見えることはできません。

この動作についての説明は、非常に高く評価されます。

答えて

1

をオブジェクトとして宣言すると、let userObservableが宣言されます。配列は実際にはオブジェクトなので、配列として終わるオブジェクトと何か関係があります。

ので、試してみてください。

userObservable:Object = {}; 
this.userObservable = this.databaseSrv.getUserObservable(); 
+0

助けるあなたをありがとうこれ!悲しいことに私はまだあなたをアップアップすることはできません:-( – jparg

+0

問題はない、うれしい私はあなたを右につかまえました少なくともトラック:D – Alex

1

さてさて、AJT_82の助けを借りて、私は今、正しい答えを得ました。

getUserObservable(){ 
    return this.af.auth 
    .filter(Boolean) 
    .switchMap((auth) => this.af.database.object('/usersUid/' + auth.uid)); 
} 

論理思われることに

userObservable:Object = {}; 

に割り当てることができる。しかし、その後、私は(サブスクライブを実行することができなかった、観察可能)、またはasyncを返します。 私は(それが観察を返す配列に「ラップ」)と同じ奇妙な結果と

userObservable: Observable<any> 

として前にそれを宣言しようとしました。私は最終的にそのようFirebaseObjectObservableとして」使用した溶液になった:。

this.userObservable = this.db.getUserAsObjectObservable() as FirebaseObjectObservable<any>; 
    this.userObservable.subscribe(data => console.log('Observable', data)); 

観察できるが、サービスからうまく返されたこの道を

ありがとうございまし

関連する問題