2017-08-01 87 views
0

我想分享的服務組件,對於這一點,我已經創建service.ts其中代碼如下:角2 - 共享服務在負載

import { Subject } from 'rxjs/Subject'; 

export class CommonService { 
    CommonList = new Subject<any>(); 
} 

當然,這項服務是供應商列表中的app.module.ts 然後,我有一個組件邊欄。 從側邊欄組件我想要訂閱此服務:

ngOnInit() { 
    this.subscription = this.CommonServicePrivate.CommonList.subscribe(
     (result: any) => { 
     console.log(result); 
     } 
    ); 
    } 

這是問題所在,如果我嘗試在此服務的app.component.ts通過一些方法添加一些列表:

click(){ 
    this.CommonService.CommonList.next([{"some_key":"some_value"}]); 
    } 

這實際上有效,但是當我嘗試這個時:

ngOnInit(){ 
    this.CommonService.CommonList.next([{"some_key":"some_value"}]); 
    } 

它不起作用。

問題是我想將此服務傳遞給加載應用程序上的組件。

在ngAfterViewInit的情況下,當我試圖這樣的結果使一些模板,我得到錯誤: ExpressionChangedAfterItHasBeenCheckedError:它檢查後表達發生了變化。先前的值:'未定義'。當前值:

如果有人有這樣的經歷,請你分享給我。 謝謝。

+0

我猜你正在尋找您需要的組件右側數據的組件加載之前路由器的決心? –

+0

葉氏,因爲有關補充工具欄的信息從REST API來了,我需要自動加載它,但還有一點就是這個側邊欄,我應該在另一個組件加載以及,所以我真的不希望兩次調用這個API,解決方案是,我將其存儲在服務,從元器件我會調用這個服務,但問題是,正如我所說:通過它的工作方法,但onload事件 - 它不工作,有時給我錯誤: 例外:表達發生了變化檢查完畢後。 –

回答

0

我可以建議爲ExpressionChangedAfterItHasBeenCheckedError工作。

這是由岡特這裏https://stackoverflow.com/a/43375600/2708210

指出,你可以做的就是讓一個setTimeout的,我有這個問題,這是一個變通的內部調用一個真正的錯誤。

this.subscription = this.service.spinner$ 
    .subscribe(item => setTimeout(() => this.showProgress = item, 0)); 

This is a peice of code from my app git link

+0

似乎工作,但我有點疑惑的setTimeout,我的意思是,如果此服務需要一定的時間,例如2其次從一些API來獲取,然後加載到它會發生什麼?你測試過這種情況嗎? –

+0

是的,我使用它的firebase情況下,它工作正常,所以農場我的情況是每次我的組件loafsbthe值變化來回,所以這是唯一的方法+不妨礙aot構建 –

+0

Yeap,我做了測試以及權利現在,只是做了睡眠功能的PHP文件,並從角度調用它,它的工作原理,男人謝謝你:) –

0

當訂閱它時,主體將爲其訂閱發出價值。當你從ngOnInit推動CommonList的價值時,它確實發出價值。但是底層的內部組件(事件訂閱)還沒有發生。

你可以通過使用ngAfterViewInit生命週期鉤子來解決這個問題,它確保內部組件樹已經初始化(期望內容投影)。本質上它將確保組件subscription已經發生。

ngAfterViewInit(){ 
    this.CommonService.CommonList.next([{"some_key":"some_value"}]); 
} 

或達到相同的目標是,用BehaviourSubject inspite的Subject的另一種方式。這兩者之間有區別BehaviourSubject商店&發出其最後一次訂閱。

+0

不,在這種情況下,還有另外一個問題,這應該在模板中呈現,這樣所有的時間我得到錯誤: ExpressionChangedAfterItHasBeenCheckedError:它檢查後表達發生了變化。先前的值:'未定義'。當前值: –

+0

@ mr_e30你給拉昇呢? –