2017-09-19 5 views
3

基本的にいくつかのユーザー情報でオブジェクトを設定するAngularサービスを作成しました。ユーザーを変更すると、サービスは、情報を更新するために、いくつかの兄弟コンポーネントによってキャプチャされた観測可能なオブジェクトを放出します。問題は、初めてデータを設定したときに、まだ誰も購読していないので、私は未定義の値を取得するということです。私はobservableをpublish()やshare()を使って 'hot'に変換することについて読んだことがありますが、私はRxJSにはかなり新しく、まだ100%で動作するかどうかはまだ分かりません。最後に発行される方法Observable

サービスコード(関連部分):

getFwcUser() : Observable<FwcUser> { 
    return this.subjectFwcUser.asObservable(); 
} 

setFwcUser(user : FwcUser) { 
    this.fwcUser = user; 

    this.subjectFwcUser.next(this.fwcUser); 
} 

注:FwcUserは、いくつかのユーザフィールドとのインタフェースです。私はボタンハンドラの中でsetFwcUserを実行してユーザを選択します。

後期加入者(成分コード):

ngOnInit() { 
    this.fwcUserService.getFwcUser() 
    .subscribe(
     (user : FwcUser) => { console.log('Received: ', user); this.fwcUser = user; } 
); 
    [......] 
} 

常に印刷: '受付:未定義'。 注:コンポーネントは '* ngIf = "fwcUser"の内部にあるため、兄弟コンポーネントから' setFwcUser 'を呼び出すとロードされます。

このコンポーネントで失われた値を読み取る方法を教えてください。

また、誰かが初心者のためのRxJSについて学ぶための良いリソースをお勧めしますか?私はAngular4についていくつかの本を読んでいますが、それらのどれもはっきりと説明していません...

ありがとう!

答えて

3

BehaviorSubjectここでの回答です。 BehaviorSubjectは、値が入ってくるだけで値を出す標準的な対象(Observable)ではなく、subscribe()の最後の値を出力します。また、BehaviorSubjects getValue()メソッドを使用して手動で最後の値を取得することもできます。

BehaviorSubject宣言のnullブロックが、初期化時のBehaviorSubjectの初期値を表すことに注意してください。それを残すか、あらかじめ値を入力しておくことができます。

サービス

EDITEDは、次のように入力し、エラーのカップルを修正しました。あなたの迅速な応答を

fwcUser: BehaviorSubject<FwcUser> = new BehaviorSubject<FwcUser>(null); 
fwcUser$ = this.fwcUser.asObservable(); 

// Set the value of the fwcUser 
updateFwcUser(user) { 
    this.fwcUser.next(user); 
} 

コンポーネント

// Subscribe to the BehaviorSubject 
ngOnInit() { 
    this.fwcUserService.fwcUser$.subscribe(_fwcUser => { 
     this.fwcUser = _fwcUser 
    } 
} 

// Get the current (previously emitted) value manually 
getFwcUser() { 
    this.fwcUser = this.fwcUserService.fwcUser.getValue(); 
} 
+0

ありがとう!そして、setFwcUser()関数はどのように見えますか?これは次のようなものでしょうか? 'this.fwcUser = new BehaviorSubject(user);' – Fel

+0

BehaviorSubjectを更新するための最良の方法を使って回答を更新しました。新しい値を受け取る関数をサービスに追加し、 'next()'関数を使用して新しい値をプッシュする必要があります。 – joshrathke

+0

こんにちは!申し訳ありません、私は前にそれをテストすることができませんでした、私は本当に忙しいです...私はあなたの指示に従って、それは完全に動作します!どうもありがとうございました :) – Fel

関連する問題