问题描述
我对ngrx适配器有疑问, 如何根据动作的参数更新减速器?
我试图从rxjs中创建一个find方法,但是出现“重叠”错误。
主界面和状态界面都共享一个关键参数,但不是id。
这是一段代码:
动作:
export const verifyDocument = createAction('[Document/API] Verify Document',props<{ status: Status }>());
减速器:
const _documentReducer = createReducer(
initialState,on(DocumentActions.upsertDocuments,(state,{ documents }) => {
return adapter.upsertMany(documents,state);
}),on(DocumentActions.verifyDocument,{ status }) => {
const records = {...state.entities}
console.log("reducer: ",records,status,"end.");
return state;
//return adapter.updateOne(???,state);
解决方法
您可能想尝试通过以下方法实现它:
首先创建一个selector
,以便您可以通过所需的属性获取对象:
export const getPersonByName = createSelector(getPeopleEntities,(people: Person[],name: string) => people.find(x = x.name == name));
利用Effect
来监听UpdateByNameAction
并依次派发UpdatePesonByIdAction
将允许您预期的行为:
public findByName$ = createEffect(() => this.actions$
.pipe(
ofType(SchemaActionTypes.FindByName),switchMap(name => this.store.pipe(select(getPersonByName,name))),map((person) => authAction.updatePesonByIdAction(person,person.id))
)
);