2017-02-20 188 views
2

在這裏我有一個服務。其signIn方法將激發另一個Service的方法,該方法返回一個Observable。每個組件都應該能夠訂閱該Observable的結果。所以我創建了一個公共響應變量Observable,它可以從每個組件中訪問。我不認爲我可以直接訂閱signIn,因爲它需要兩個參數,只有一個觀察者會真正知道。Angular 2觀察結果http

問題是,響應是undefined在開頭。所以你不能在另一個組件的構造函數中訂閱它。

那麼我怎麼能訂閱響應,當我不知道數據何時到達?有任何想法嗎?

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()); 

    } 
} 

這是AuthComponent方法,其中用戶名和密碼都來自

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

」。什麼數據? 'user'和'password'從哪裏來? –

+0

@Günter用戶和密碼來自組件。數據來自http get。 –

回答

2

通常你應該只返回Observable

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

如果我直接訂閱signIn,我需要傳遞用戶名和密碼。並且每次都會觸發http獲取。 –

+0

看到我更新的答案,所有其他組件現在可以訂閱'data'主題,並且如果有任何其他組件登錄,它們將被通知.. – mxii

+0

謝謝。很有用! –