2017-04-05 84 views
0

我有一個Angular 2應用程序,其中有一個帶有返回Observable的getAlgemeneInfo()方法的'AlgemeneInfoService'。RxJS合併流並使用兩者的值來調用第三個

使用angular-redux/store,我有一個商店裏有一個'Dossier'和'Verpleegperiode'對象,它們都有一個Id,AlgemeneInfoService用來獲取'AlgemeneInfo'對象。 (該VerpleegperiodeId可以爲null)

我試圖把ActiveAlgemeneInfo,應通過調用AlgemeneInfoService被刷新時的任何檔案或Verpleegperiode改變狀態 - 對象,在國家的對象。

我的計劃是使用處理這些訂閱和有一個方法getActiveAlgemeneInfo(返回「selectedAlgemeneInfo」,它被設置在訂購的ActiveAlgemeneInfo狀態對象的ActiveAlgemeneInfoService):

@select(state => state.dieet.activeAlgemeneInfo) 
private activeAlgemeneInfo$: Observable<AlgemeneInfo>; 

在構造服務的,我設置訂閱:

Observable.combineLatest(
    this.activeInfohosVerpleegperiode$, 
    this.activeInfohosDossier$ 
) 
.distinctUntilChanged() 
.subscribe(([v, d]) => { 
    const verpleegperiodeId = v != null ? v.verpleegperiodeId : null; 
    const dossierId = d.dossierId; 
    console.log(`vp id: ${verpleegperiodeId} - d id: ${dossierId}`); 
    this._setActiveAlgemeneInfo(dossierId, verpleegperiodeId); 
}); 

this.activeAlgemeneInfo$.subscribe(algemeneInfo => this.selectedAlgemeneInfo = algemeneInfo); 

而且在服務上,我也得到了一個方法:

private _setActiveAlgemeneInfo = (dossierId: number, verpleegperiodeId: number) => { 
this._algemeneInfoService 
    .getAlgemeneInfo(dossierId, verpleegperiodeId) 
    .subscribe(algemeneInfo => this._dieetActions.selectAlgemeneInfo(algemeneInfo)); 
} 

當服務被構造和方法getActiveAlgemeneInfo()被調用:

public getActiveAlgemeneInfo =(): Observable<AlgemeneInfo> => { 
    return this.activeAlgemeneInfo$; 
} 

它只是修建垃圾http請求,而當我CONSOLE.LOG的Observable.combineLatest()時,檔案和Verpleegperiode是與之前的請求完全一樣。

我該如何得到這個工作?

回答

0

你應該移動distinctUntilChanged - 因爲它不會做「深」比較,它只是比較基準 - 和combineLatest這將永遠是一個新的數組。

請嘗試以下,看看是否與你的問題,有助於:

Observable.combineLatest(
    this.activeInfohosVerpleegperiode$.distinctUntilChanged(), 
    this.activeInfohosDossier$.distinctUntilChanged() 
) 
.subscribe(([v, d]) => { 

另外,您應該提供一個比較法,做執行深比較像這樣:

Observable.combineLatest(
    this.activeInfohosVerpleegperiode$, 
    this.activeInfohosDossier$ 
) 
.distinctUntilChanged(_.isEqual) // from: https://lodash.com/docs/#isEqual 
.subscribe(([v, d]) => {