angular NGRX: невозможно выбрать одно значение в сущности ngrx на основе идентификатора - PullRequest
0 голосов
/ 08 ноября 2018

Я пытаюсь выбрать объект по идентификатору из состояния объекта. Ниже мой редуктор.

 export interface MessageState extends EntityState<Message> {
  // additional entities state properties
  loaded: boolean;
  loading: boolean;
}

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

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

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

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

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

    }

    default: {
      return state;
    }
  }
}

Ниже мой файл index.ts

export interface State extends fromRoot.AppState {
  queueModule: QueueState;
}

export interface QueueState {
  msgHeaders: fromMsgHeaders.MessageHeaderState
}

export const reducers: ActionReducerMap<QueueState> = {
  msgHeaders: fromMsgHeaders.reducer

};

export const getQueueState$ = createFeatureSelector<QueueState>('queueModule');

Я пытаюсь сформировать селектор, когда переданный Id вернет значение из сущности.

    export const selectMessages = createSelector(
      fromFeatures.getQueueState$,
      (state: fromFeatures.QueueState) => state.msgs
    );

    export const {
      selectAll: selectAllMessages,
      selectEntities: selectMessagesEntities,
      selectIds: selectMessagesIds,
      selectTotal: selectMessagesTotal
    } = adapter.getSelectors(selectMessages);

Я посмотрел на многие ресурсы, но ни один не ясно, как выбрать объект, передав идентификатор.

Ответы [ 2 ]

0 голосов
/ 12 ноября 2018

@ngrx/entity действительно предоставляет getEntityValueById после их выпуска v6.1.0 ( журнал изменений сущности ngrx ), где они представили dictionary.

Таким образом, используя это, я смог получить одно значение сущности по его идентификатору следующим образом.

// in the selector
import { Dictionary} from '@ngrx/entity;

export const getMessageById = () => {
  return createSelector(
    selectMessagesEntities,                
    (entities: Dictionary<Message>, props: { messageId: number }) => {
      return entities[props.messageId];
    },
  );
};


//to call the selector


this.msg$ = this.store.pipe(select(
      fromStore.getMessageById(), { messageId: 10 }
    )).pipe(
      map(
        (message: Message) => {
          return this.msg = message;
        },
      )
    );

Также была задокументирована отличная ссылка на этот подход. здесь .

0 голосов
/ 08 ноября 2018

@ngrx/entity не предоставляет селектор getOneById.

В большинстве случаев это то, что вам не нужно делать.

При этом существуют способы создания селектора, который делает именно это, для получения дополнительной информации см. (NgRx: параметризованные селекторы) [https://blog.angularindepth.com/ngrx-parameterized-selector-e3f610529f8].

Например:

export const getCount = createSelector(
  getCounterValue, 
  (counter, props) => counter * props.multiply
);

export const selectCustomer = (id: string) => createSelector(
  selectCustomers,
  customers => customers[id]
);
...