Я уже 2 дня изо всех сил пытался составить состояния модуля featureA («сценарии») и вложенного модуля featureB («намерения»).
Вот желаемая структура моего состояния (структура 1):
{
authentication: { ... },
router: { ... },
scenarios: {
resources: { ids: { ... }, entities: { ... } },
intents: {
resources: { ids: { ... }, entities: { ... } }
}
}
}
Я бы тоже был доволен (структура 2):
{
authentication: { ... },
router: { ... },
scenarios: { ids: { ... }, entities: { ... } },
intents: { ids: { ... }, entities: { ... } },
}
Хотя это не отражает структуру моих модулей.
Проблема со структурой 1 заключается в том, что scenarios/reducers/index.ts
предоставляет ActionReducerMap
, scenarios/modules/intents/reducers/index.ts
также предоставляет ActionReducerMap
, и я не знаю, как их составить. Все, что я пробовал, даже не компилируется из-за конфликтов типов.
Проблема со структурой 2 заключается в том, что intents
часть состояния продолжает выпадать из состояния из-за того, что IntentsModule
не загружается при загрузке первой страницы и другие редукторы приложения выполняют свою работу.
Вот код:
/scenarios/scenarios.module.ts:
import { reducers, getInitialState } from './reducers';
@NgModule({
imports: [
...,
ScenariosRoutingModule,
StoreModule.forFeature('scenarios', reducers, { initialState: getInitialState }),
EffectsModule.forFeature([ScenariosEffects]),
],
})
export class ScenariosModule {}
/scenarios/reducers/index.ts:
import * as fromRoot from '../../../app.reducers';
import * as fromScenarios from './scenarios.reducers';
import * as fromIntents from '../modules/intents/reducers';
export interface ScenariosState {
resources: fromScenarios.State;
intents: fromIntents.IntentsState;
}
export interface State extends fromRoot.State {
scenarios: ScenariosState;
}
export const reducers: ActionReducerMap<ScenariosState> = {
resources: fromScenarios.reducer,
intents: fromIntents.reducers, <-- This is the part with types conflicts
};
/scenarios/modules/intents/intents.module:
import { reducers, getInitialState } from './reducers';
@NgModule({
imports: [
...,
IntentsRoutingModule,
StoreModule.forFeature('intents', reducers, { initialState: getInitialState }), <-- Also this part seems to add 'intents' as a top-level property of state
EffectsModule.forFeature([IntentsEffects]),
],
})
export class IntentsModule {}
/scenarios/modules/intents/reducers/index.ts:
import * as fromIntents from './intents.reducers';
export interface IntentsState {
resources: fromIntents.State;
}
export interface State {
intents: IntentsState;
}
export const reducers: ActionReducerMap<IntentsState> = {
resources: fromIntents.reducer,
};
export function getInitialState(): IntentsState {
return {
resources: fromIntents.initialState,
};
}