0

我想在angular2中使用「Subject」類將事件廣播爲observable,從服務到所有組件中具有該服務的實例。angular2從服務廣播事件到使用該服務的所有組件

在我的服務

,我有以下幾點:

private loggedIn = new Subject<boolean>(); 

isUserLoggedIn(): Observable<boolean> 
{ 
    return this.loggedIn.asObservable(); 
} 

test() 
{ 
    this.loggedIn.next(true); 
} 

然後在使用該服務的組成部分,我有(_auth是上面定義的相同服務):

ngOnInit() 
    { 
     console.log("yay!"); 
     this._auth.isUserLoggedIn() 
      .subscribe(
       d => { 
        console.log(d); 
       }, 
       d => { 
        console.log(d); 
       }, 
       () => { 
        console.log("Done!"); 
       } 
      ); 
    } 

現在問題是如果我從這個相同的組件中調用服務的方法this._auth.test();,則一切正常,console.log行將在此組件中執行。但是,如果服務的方法是從另一個組件調用的,則此組件不會觸發以運行console.log行。

如何確保即使服務的方法由另一個組件觸發,該組件中的代碼也能運行? (假設兩個組件都在同一時間渲染)。

謝謝!

回答

1

不提供每個組件的服務,只提供它

@NgModule({ 
    providers: MySharedService, 
    ... 
}) 
export class AppModule {} 

否則爲每個組件(每個供應商)創建了一個新的服務實例

+0

我已經做到了。共享服務僅在AppModule中提供,無法在其他地方提供。 –

+1

然後,我可以想象的唯一的事情是,組件僅在**事件發送後訂閱**。您可以嘗試使用「BehaviorSubject」而不是「Subject」進行驗證。 –

+0

您可以詳細說明BehaviourSubject嗎? –