0

所以我有一个自定义实体,我将在 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工作,addOneupsertOne国家无能为力。当我在没有适配器的情况下进行更新时,reducer 甚至没有反应,这让我怀疑我的配置有问题。花了半个星期解决这个问题,但没有成功,所以我希望我能在这里找到一些帮助。谢谢!

4

0 回答 0