所以我有一个自定义实体,我将在 UI 中添加它:
会议.ts:
export interface Meeting {
summary: MeetingSummary;
agenda: any;
audience?: Audience[];
venue?: {
lat?: number;
long?: number;
};
invitationKey?: string;
key: string;
activeProposalId?: string;
createdAt?: string;
updatedAt?: string;
createdBy?: string;
updatedBy?: string;
owner?: string;
}
我使用新的创建者语法搭建了@ngrx/entity:
会议.actions.ts:
export const beginLoadMeetings = createAction(
'[ Meeting ] Begin Load Meetings',
props<{ uid: string }>()
);
export const loadMeetings = createAction(
'[Meeting/API] Load Meetings',
props<{ meetings: Meeting[] }>()
);
export const beginAddMeeting = createAction(
'[ Meeting ] Begin Add New Meeting',
props<{ meeting: Meeting }>()
);
export const addMeeting = createAction(
'[ Meeting ] Add Meeting to Store',
props<{ meeting: Meeting }>()
);
export const upsertMeeting = createAction(
'[Meeting/API] Upsert Meeting',
props<{ meeting: Meeting }>()
);
export const addMeetings = createAction(
'[Meeting/API] Add Meetings',
props<{ meetings: Meeting[] }>()
);
// ...
以及相应的减速机
会议.reducer.ts
export interface MeetingState extends EntityState<Meeting> {
loading: boolean;
}
export interface State extends fromRoot.State {
meetings: MeetingState;
}
export const adapter: EntityAdapter<Meeting> = createEntityAdapter<Meeting>(
{
selectId: (meeting: Meeting) => (meeting.key)
}
);
export const initialState: MeetingState = adapter.getInitialState({
loading: false
});
const meetingReducer = createReducer(
initialState,
on(MeetingActions.beginLoadMeetings,
(state) => ({...state, loading: true})
),
on(MeetingActions.beginAddMeeting,
(state) => state
),
on(MeetingActions.addMeeting,
(state, action) => adapter.addOne(action.meeting, state)
),
on(MeetingActions.upsertMeeting,
(state, action) => adapter.upsertOne(action.meeting, state)
),
//...
);
我将调度一个beginAddMeeting
动作,触发一个存储到后端的效果。这会正确发生,并且效果也正确地addMeeting
使用正确的有效负载分派操作,我可以在 DevTools 中验证这一点。但是,状态没有改变,实体也没有被添加到商店,所以我所有的容器都没有注意到变化。
奇怪的是,当我 dispatchbeginLoadMeetings
触发类似效果时,只从后端获取所有实体,商店得到正确更新。总之,addMany
工作,addOne
对upsertOne
国家无能为力。当我在没有适配器的情况下进行更新时,reducer 甚至没有反应,这让我怀疑我的配置有问题。花了半个星期解决这个问题,但没有成功,所以我希望我能在这里找到一些帮助。谢谢!