Я сталкиваюсь с NgRx, и я не могу понять, как может быть так сложно добавить значение в магазин и получить его. Во всяком случае, это то, что я сделал до сих пор
Эффекты ts:
export class idEffects {
saveId$ = createEffect(() =>
this.actions$
.pipe(
ofType(idActions.addIdAction),
tap(payload => {
console.log("action",payload);
})
)
,{dispatch: false});
constructor(
private actions$: Actions
) {}
}
Actions ts:
export const ADD_ID = '[Id Action] add id';
export const addIdAction = createAction(
ADD_ID,
props<{id: any}>()
)
Редуктор ts:
export interface IdState {
id: any;
}
export const defaultId: IdState = {
id: undefined
};
export const idReducer = createReducer (
defaultId,
on(idActions.addIdAction, (state, action) => {
//console.log("Calling id reducer", action);
return {
id: action
}
})
)
и селектор ts:
export const selectIdState =
createFeatureSelector<IdState>("id")
export const selectIdValue = createSelector(
selectIdState,
id => id
);
Теперь вот что у меня есть в моем app.module.ts
StoreModule.forRoot({id: idReducer}),
EffectsModule.forRoot([IdEffects]),
StoreModule.forRoot(reducers, {
metaReducers
}),
StoreDevtoolsModule.instrument({maxAge: 25}),
StoreRouterConnectingModule.forRoot({
stateKey: 'router',
routerState: RouterState.Minimal
})
Кажется, что хранение данных работает хорошо, потому что панель Redux в моей консоли возвращает следующее:
id(pin):"1"
data(pin):"Hello There"
type(pin):"[Id Action] add id"
Но, когда я пытаюсь получить этот объект, я получаю undefined
и Я делаю это так:
this.id$ = storeId.pipe(select(selectIdValue))
и в html
<h4>The id obj is: {{id$ | async}}</h4>
Но это ничего не пишет. Я попытался получить результат, используя подписку в компоненте, и он получил undefined
, как это возможно?