Я использую Angular 6, ngrx / store, ngrx / эффектов.У меня есть эффект, который должен срабатывать, когда я нажимаю кнопку «Сохранить».Я использую withLatestFrom
там, чтобы собрать все данные, которые мне нужны для отправки на сервер:
@Effect({dispatch: false})
saveAll$ = this.actions$.pipe(
ofType(ActionTypes.Save),
withLatestFrom(
this.store.select(fromReducers.getData1),
this.store.select(fromReducers.getData2),
this.store.select(fromReducers.getData3),
this.store.select(fromReducers.getData4)
),
switchMap(([action, data1, data2, data3, data4]: [ActionType, Data1[], Data2[], Data3[], Data4[]]) => {
// here is some operations with these data
return this.apiService.saveData({data1, data2, data3, data4})
})
)
Вот getData1
селектор:
export const getData1= createSelector(
getItems,
getIndexes,
(items, indexes) => {
console.log('HI, I AM getData1');
return transformItems(items, indexes);
}
);
getItems
,в свою очередь, верните state.items
.Проблема в том, что state.items
можно изменить другим эффектом:
@Effect()
handleItemsChanges$ = this.actions$.pipe(
ofType(ActionTypes.ChangesInItems),
withLatestFrom(
this.store.select(fromReducers.getItems),
this.store.select(fromReducers.getUsers),
),
switchMap(([action, items, users]: [ActionType, Item[], User[]]) => {
console.log('I AM handleItemsChanges');
const actions = [];
if (itemsShouldBeUpdated) {
actions.push(new UpdateData(changes))
}
})
)
Таким образом, селектор getData1
получает данные из хранилища в зависимости от другого эффекта с именем handleItemsChanges
.handleItemsChanges
Эффект срабатывает каждый раз, когда что-то меняется, связанное с предметами, и снова его пересчитывает.В результате, в saveAll
я получаю не факт state.items
.Что я делаю неправильно?Может быть, я должен использовать другой оператор вместо withLatestFrom
или что может быть решением?Спасибо
PS Кстати, я использую withLatestFrom
каждый раз, когда хочу получить данные из магазина.Это правильно?