У меня есть приложение ngrx, и я не могу получить значение из селектора в результате по полезной нагрузке, которую я отправил в компоненте.
Я пишу пример кода того, с чем я имею дело:
Это мое состояние, в нем простой массив документов.
export const initialState = {
docs: [{ id: 1, name: "doc1" }, { id: 2, name: "doc2" }]
};
export const reducer = createReducer(
initialState,
);
Я не выполняю никаких действий по этим вопросам, это не проблема.
В моем компоненте Я получаю массив с помощью селектора:
docs$ = this.store.pipe(select(fromStore.getAllDocs));
{{docs$ | async | json}}
редуктор:
export const selectDocsState = createFeatureSelector("docs");
export const selectDocsStatusState = createSelector(
selectDocsState,
state => state["docs"]
);
export const getAllDocs = createSelector(
selectDocsStatusState,
getDocs
)
У меня также есть селектор, чтобы получить по id:
{{docsById$ | async | json }}
docsById$ = this.store.pipe(select(fromStore.getById, { id: 1 }));
в редуктор:
export const getById = createSelector(
selectDocsStatusState,
getDocs,
(state, docs, props) => {
console.log({ props });
return docs.docs.docs.filter(d => d.id === props.id);
}
)
Пока все хорошо. Я получаю массив документов и отображаю его.
Теперь, в моем компоненте я отправляю некоторые действия и ловлю по эффекту:
this.store.dispatch({ type: 'GET_DOC', payload: { id: 2 } });
И в результате я хочу знать, является ли этот идентификатор в магазине или нет.
Поэтому я использую withLatestFrom
из rx js с селектором getById.
withLatestFrom((a: any) =>
this.store.pipe(select(fromDocs.getById, { id: a.payload.id }))
),
Проблема в том, что я не получаю значение от селектора, а получаю экземпляр хранилища.
tap(v => {
console.log({ v });
}),
Полный эффект:
getDoc$ = createEffect(() =>
this.actions$.pipe(
ofType("GET_DOC"),
map(a => a),
tap(a => {
console.log({ a });
}),
withLatestFrom((a: any) =>
this.store.pipe(select(fromDocs.getById, { id: a.payload.id }))
),
tap(v => {
console.log({ v }); // <--------------- HERE SHOULD BE THE DOC AND THE ACTION.PAYLOAD, v[0].a.payload, v[1].id
}),
exhaustMap(payload => {
return of({ type: "SOME_ACTION", payload: null });
})
)
);
Вот мой полный пример в stackbliz.
Что мне здесь не хватает?