2017-07-14 29 views
0

我有一個角度組件顯示列表中的項目。每個itemn都可以被選擇,並且所選項目的id將被存儲在狀態中。所以我的狀態對象看起來像這樣f.e:如何用當前狀態值分配一個動作?

{ items: Item[]; selected: string[] } 

現在我叫DeleteSelectedAction這個動作得到selected作爲有效載荷。此操作將使用效果等調用某個WebAPI。

現在我發現了兩種方法可以做到這一點。

第一:從庫中選擇selected並訂閱它,並用行動

store.select(fromItems.getSelected).subscribe(ids => { 
    this.selected = ids; 
}); 
... 
store.dispatch(new itemActions.DeleteSelectedAction(this.selected); 

二傳值:沒有傳遞價值的行動,但實際上取selected

store.dispatch(new itemActions.DeleteSelectedAction()); 

// in effect 
@Effect() 
delete$: Observable<Action> = this.actions$ 
    .ofType(fromItems.DELETE) 
    .withLatestFrom(this.store.select(fromItems.getSelected) 
    .switchMap([action, selected] => { 
    return this.service.delete(selected) 
     .map(new itemActions.DeleteSuccessAction()) 
     .catch(err => Observable.of(new itemActions.DeleteFailAction(err)); 
    }); 

我不喜歡第一種方式,因爲我需要使用訂閱並需要正確取消訂閱。第二種方法是可以的,但只有當動作有副作用時。 所以現在我正在尋找第三種方法。在我的腦海這種方式如下所示:

store.dispatchWithLatestFrom(
    fromItems.getSelected, 
    (selected) => new itemActions.DeleteSelectedAction(selected)); 

我怎麼能得到類似的東西與rxjs運營商?

回答

1

即使該操作沒有副作用,您的第二種方法也應該可以正常工作。使用@Effect轉換一個動作而不會產生副作用是該庫的完全合法使用。請參閱內容聚合器here上的章節。在這種情況下,我肯定會調用類似DELETE_SELECTED的動作,而不僅僅是DELETE

0

我們使用的是

store.select(fromItems.getSelected).take(1).subscribe(ids => 
    store.dispatch(new itemActions.DeleteSelectedAction(ids)) 

是的,而不是派遣它裏面的訂閱你也可以把它分配給一個字段,...但是這是我找到工作的最短途徑對我們來說很好。

相關問題