Как определить редуктор на верхнем уровне? - PullRequest
0 голосов
/ 12 сентября 2018

У меня есть два файла редуктора, которые обрабатывают две области состояния в моем модуле ...

export interface MyState {
  people: PeopleState;
  pets: PetState;
}

export const reducers: ActionReducerMap<MyState> = {
  people: peopleReducer,
  pets: petsReducer
};

Это отлично работает.Тем не менее, у меня есть некоторые действия, которые необходимо обновить обе области государства.Я хотел бы справиться с этим, имея файл редуктора, который имеет дело с вещами на уровне MyState и может обновлять людей и домашних животных.Я хотел бы сохранить оба существующих редуктора, которые обрабатывают это, на более низких уровнях.

Я не вижу, как зарегистрировать редуктор верхнего уровня.То, как теперь работает код, любой редуктор, добавленный в ActionReducerMap, должен быть добавлен как свойство внутри MyState, а не обрабатывать MyState в целом.

У кого-нибудь есть идеи?

Спасибо, Ник

1 Ответ

0 голосов
/ 14 сентября 2018

Полагаю, что единственным решением здесь является использование metaReducer, проверьте эту статью: https://netbasal.com/implementing-a-meta-reducer-in-ngrx-store-4379d7e1020a

Описание: metaReducer - это своего рода редуктор, который стоит над другими редукторами.Он должен иметь свои собственные действия, может иметь свои собственные эффекты.Вы можете использовать его таким образом:

export function metaReducer( reducer ) {
  return function reduce( state: ParentState, action: MetaReducerAction ) {
     switch(action.type)
        case PARENT_ACTION:
          return {
            ...state,
            people: peopleReducer(state.people, new DoSthWithPeople()),
            pets: petsReducer(state.pets, new DoSthWithPets())
          }
        default:
          return reducer(state, action);
  }
}

Где:

interface ParentState {
   pets: PetsState,
   people: PeopleState
}

type MetaReducerAction = ParentAction <-- this has type PARENT_ACTION

Так что рабочий процесс прямо вперед.В месте, где вы хотите, чтобы действие обновляло состояния как людей, так и животных, вам нужно отправить PARENT_ACTION, тогда действия DoSthWith ... будут запущены на обоих слоях состояния.Если вы отправляете другое действие (действие типа, которое не обрабатывается metaReducer, поэтому отличается от PARENT_ACTION), оно позволит другим редукторам обрабатывать действие (проверьте, что в разделе по умолчанию).

Последнеечасть - это конфигурация, она должна выглядеть следующим образом:

StoreModule.forFeature(compose(metaReducer, combineReducers)(reducers))

Где редукторы просто:

const reducers = {
   pets: petsReducer,
   people: peopleReducer
}

Редактировать: форматирование

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...