Правильный способ доступа к магазину в ngrx / effect - PullRequest
0 голосов
/ 07 июня 2018

Я использую 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 каждый раз, когда хочу получить данные из магазина.Это правильно?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Я нашел обсуждение на ngrx github: https://github.com/ngrx/platform/issues/467 Похоже, у нас есть 2 ужасных варианта для доступа к магазину из эффектов.

0 голосов
/ 27 октября 2018

вам нужно выполнить действие handleItemsChanges, прежде чем saveAll будет запущено.Один из способов сделать это - создать эффект для действия handleItemsChanges и запустить действие save.

Фреймворк гарантирует порядок выполнения (handleItemsChanges сначала, затем save), таким образом операция withLatestFrom будет работать так, как вы ожидаете.

...