Если вы рассуждаете по своему коду и поведению приложения, вы обнаружите, что у вас есть - два нажатия кнопки (или вы можете называть их действиями) - сначала открыть модальный режим, затем запустить метод Http или закрыть модальный режим. Между этими двумя действиями у вас есть состояние зависания - идентификатор элемента или другие данные. А состояние в NgRx живет в его хранилище, поэтому имеет смысл хранить его там, и тогда эти два действия легко отменить (щелчки кнопок).
list.component.ts
deleteItem(itemId: string) {
this.store.dispatch(new fromStore.openModal({
action: fromStore.DeleteItem,
payload: itemId
}));
}
your.reducer.ts
case fromStore.openModal:
// add to the state
Confirm-dialog.component.ts
confirm$ = fromEvent(this.confirmBtn, 'click').pipe(mapTo(new fromStore.ModalAction()))
cancel$ = fromEvent(this.confirmBtn, 'click').pipe(mapTo(new fromStore.CloseModal()))
ngAfterViewInit() {
merge(this.confirm$, this.cancel$).pipe(take(1)).subscribe()
}
list.effects.ts
@Effect() DeleteItem$: Observable<Action> = this.actions$
.pipe(
ofType(SomeActionTypes.ModalAction),
mergeMap(() => {
return this.store.select(state => state.selectModalState).pipe(
map({action, payload}) => {
return {
type: action,
payload
};
})
)
)
Затем вы просто строите все другие действия, например DeleteItem
в эффектах. Также ваш модал теперь может работать с любым действием, которое вы ему предоставляете - DeleteItem
, UpdateItem
и т. Д.
обратите внимание, что этот код предназначен только для визуализации. Я не пробовал, так что вам придется работать с именами, синтаксисом и т. Д.