2017-02-20 10 views
2

ここに私はサービスを持っています。そのsignInメソッドはObservableを返す別のServiceのメソッドを起動します。すべてのコンポーネントはObservableの結果を購読できる必要があります。そこでObservableというパブリックレスポンス変数を作成しました。これはすべてのコンポーネントからアクセスできます。 Observerが実際に知っているだけの2つのパラメータが必要なので、signInに直接登録することはできません。角2はhttpの結果を観察します

問題は、応答が最初にでが未定義であることです。したがって、別のコンポーネントのコンストラクタでそれを購読することはできません。

データがいつ届くのかわからないときに、どのように回答を購読できますか?何か案は?

export class AuthService{ 

    public response:Observable<any[]>; 

    constructor(private httpService:HTTPService){ 
     this.response = new Observable(); 
    } 

    signIn(user:String, password:String){ 

     this.response = this.httpService.query({user: user, pass: password}) 
     .map((r: Response) => r.json()); 

    } 
} 

これは通常、あなただけのObservableことを返す必要があり、ユーザーとパスワードが

onSubmit(f:NgForm){ 
    this.authService.signIn(f.value.user, f.value.password); 
} 
+0

「データが到着するとき」どのようなデータですか? 'user'と' password'はどこから来たのですか? –

+0

@Günterのユーザーとパスワードは、コンポーネントから来ています。データはhttp getから取得します。 –

答えて

2

から来Authコンポーネントのメソッドです:

import { BehaviorSubject } from 'rxjs'; 

export class AuthService { 

    public data = new BehaviorSubject<any[]>([]); 

    constructor(private httpService: HTTPService) { } 

    signIn(user:String, password:String): Observable<any[]> { 

     return this.httpService.query({user: user, pass: password}) 
      .map((r: Response) => r.json()) 
      .map(data => { this.data.next(data); return data; }); // OPTIONAL if you want to store data in you service.. 

    } 
} 

その他のコンポーネントは、今そのdata対象に購読することができます。

呼び出しコンポーネントが登録され、完了します。

Http-Request-Observablesは、リクエストごとに完了します。

+0

サインインに直接登録すると、ユーザーとパスワードを渡す必要があります。そして、毎回httpを発射します。 –

+0

私の更新された答えを見てください。他のすべてのコンポーネントがその 'data'サブジェクトを購読できるようになりました。他のコンポーネントがログインすると通知されます。 – mxii

+0

ありがとう。非常に便利! –

関連する問題