NGRX 实体:如何在 UpsertOne 中将 action.payload 分配给状态 属性

NGRX entity: How to assign action.payload to state property in UpsertOne

我在实体状态下有一个减速器。如何在对 UPSERT_Message_SUCCESS 操作执行 upsertOne 时将 action.payload.Message 分配给 saveMessage.msg

 export interface MessageState extends EntityState<Message> {
  // additional entities state properties
    selectedMessageId: number | null;
    loaded: boolean;
    loading: boolean;
  saveMessage?: {
    loaded: boolean;
    loading: boolean;
    msg?: Message;
  };
}

export const adapter: EntityAdapter<Message> = createEntityAdapter<Message>({
  selectId: (msg: Message) => msg.messageId,

});

export const initialState: MessageState = adapter.getInitialState({
  // additional entity state properties
    selectedMessageId: null,
    loaded: false,
    loading: false,
  saveMessage: {
    loaded: false,
    loading: false
  },

});

export function reducer(state = initialState, action: MessageActionsUnion): MessageState {
  switch (action.type) {

    case MessageActionTypes.UPSERT_MessageS_SUCCESS: {
      return adapter.upsertMany(action.payload.Messages, { ...state, loaded: true, loading: false });
    }



    case MessageActionTypes.UPSERT_Message: {
      return { ...state,loading: true, loaded:false };
    }


   //assign action.payload.message to saveMessage.msg

    case MessageActionTypes.UPSERT_Message_SUCCESS: {
   return  adapter.upsertOne(action.payload.saveMessageHeader, {...state,loaded:true,loading:false});

  // return {
  //   ...state,
  //   saveMessage: {
  //     loading: false,
  //     loaded: true,
  //     msgHeader: action.payload.saveMessageHeader
  //   }
 // };
}
    case MessageActionTypes.UPSERT_Message_FAIL: {
      return { ...state };
    }



    default: {
      return state;
    }
  }
}

对应的动作调用签名如下:

export class SaveMessageSuccess implements Action {
  readonly type = MessageActionTypes.SAVE_MESSAGE_SUCCESS;
  constructor(public payload:  {saveMessage:partial <Message> }) {
  }
}

upsertOne 不允许 Partial<Entity> 但需要实体 T.

在你的情况下,将 action creator 更改为以下内容应该可以解决问题:

export class SaveMessageSuccess implements Action {
  readonly type = MessageActionTypes.SAVE_MESSAGE_SUCCESS;
  constructor(public payload:  {saveMessage: Message}) {
  }
}

@ngrx/entity docs