Эффект, использующий withLatestFrom, назвал его, даже ofType (action) не был запущен - PullRequest
0 голосов
/ 01 июня 2018

Я использую Angular 5, ngrx / store.У меня есть эффект:

@Effect()
  updateAfterChanges$ = this.actions$.pipe(
    ofType(ActionTypes.ChangesInItems),
    withLatestFrom(
      this.store.select(fromReducers.getItemsList)
    ),
    switchMap(([action, itemsList]: [ActionType, Items[]]) => {
       return [new UpdateItems()]
    })
)

getItemsList выглядит так:

export const getItemsList= createSelector(
  fromAnotherReducer.getAllItems,
  getCurerntItemdId,
  (allItems, itemId) => collectItems(allItems, allItems[itemId].subItems)
);

Этот селектор вызывается на совершенно другой странице - page1.Где у меня нет предметов вообще.Элементы загружаются с сервера, когда я открываю окно модели на page2.Так что на page1 я получаю ошибку Cannot read property 'subItems' of undefined.Почему этот селектор даже не вызывается после ofType(ActionTypes.ChangesInItems)?Я должен добавить проверку в селекторе:

Object.keys(allItems).length !== 0 ?
    collectItems(allItems, allItems[itemId].subItems) : []

Почему это происходит?Я не хочу добавлять проверки в каждый селектор, который использует динамически загружаемые данные.Я ожидаю, что эффект будет вызван только в ответ на ofType(ActionTypes.ChangesInItems)

1 Ответ

0 голосов
/ 01 июня 2018

При использовании здесь, withLatestFrom всегда будет выполняться.Вам не нужна логика для проверки элементов, немного подправьте структуру:

@Effect()
updateAfterChanges$ = this.actions$.pipe(
  ofType(ActionTypes.ChangesInItems),
  switchMap(action => {
    return this.store.pipe(
      select(fromReducers.getItemsList),
      map(items => {
        return [new UpdateItems()]
      }),
    );
  }),
)
...