2017-01-24 27 views
-1

TLDR:直到用戶執行操作(例如,單擊按鈕)時,可觀察對象纔會觸發組件重新渲染。Angular2 Observable not triggering rerendering

我正在更新由組件內注入的服務中包含的BehaviorSubject支持的observable。

在我的組件中,我使用簡單的*ngIf="myObservable$ | async"來顯示div。

我設法複製2分的情況下,一個工作,一個是不,但我不明白有什麼區別:

//CASE 1 
this._mySubject$.next(true); //THIS DOES TRIGGER RERENDERING 
//CASE 2 
this.http.get(url) 
.map(res => res.json()) 
.subscribe(body => { 
    this._mySubject$.next(true); //THIS DOESN'T TRIGGER RERENDERING UNTIL AN ACTION IS MADE 
}); 
+2

整個流如何觸發?你使用的是什麼版本的angular2? - 你可以通過在'ngZone.run(...)'中包裝'.next(true)'來解決你的問題 - 但是這對於簡單的休息調用來說不是必須的,所以我目前的猜測是你的rest-call以某種方式包裝在其他異步/外部觸發器中 – olsn

+0

我正在使用Angular 2.1.0。 我已經訂閱了observable的組件調用了服務函數,它使得簡單的http調用(不包含任何東西)。 – Yanis26

+0

使用'subcribe()'塊調用'.next()'的任何特定原因?訂閱模塊不應該用於產生副作用。只有觀察者的最終消費者才能認購。 – AngularChef

回答

0

如果您需要做的副作用,何樂而不爲呢在操作

this.http.get(url) 
.map(res => res.json()) 
.do(() => this._mySubject$.next(true)) 
.subscribe(); 
+0

我也試過這種方式,它仍然不會觸發重新渲染。 – Yanis26

+0

@ Yanis26在模板中,你正在執行'* ngIf =「_ mySubject $ | async」'? –

+0

我在我的模板('_.mySubject $ .asObservable()')中使用了我的BehaviorSubject的observable,所以組件不能改變數據。 奇怪的是,我正在用另外3個BehaviorSubject/Observable執行相同的設置:http請求 - >將接收到的數據推送到我的主題 - >組件自我更新。 只有這一個不起作用,這是非常令人沮喪的,因爲一切都是完全一樣的。 – Yanis26

0

這可能是一個更好的主意,訂閱在ngOnInit方法的行爲主體和設置在ngIf使用屬性。由於實際對象不是一個新對象,而是來自行爲主體的新發射,它可能不會觸發Angular的變化檢測。它似乎最適合不可變對象。