Угловая сущность NGRX, считающая один и тот же объект - PullRequest
0 голосов
/ 02 октября 2019

У меня есть звонок, где я получаю список идентификаторов человека, у которого есть неподтвержденные отчеты, и я хочу отслеживать количество отчетов, которые есть у этого человека. Я храню эти данные с помощью EntityAdapter. Теперь я не могу понять, как вести подсчет в адаптере.

Пока я проверил документы ngrx, попробовал немало манипуляций с кодом и задал мой вопрос в чате gitter,пока никакого результата.

Мой сервис возвращает массив строк, который содержит идентификатор человека. Примером данных могут быть:

Array of person IDs

Здесь у меня дважды один и тот же Id, что означает, что у человека есть 2 отчета. Я хочу сохранить этот идентификатор и вести счет «2». В данный момент я использую этот код для адаптера:

    export interface State extends EntityState<string> {
      showRegistrations: boolean,
      loading: boolean,
      loaded: boolean,
    }

    export const adapter: EntityAdapter<string> = createEntityAdapter<string>({
      selectId: (item: string) => item,
      sortComparer: false,
    });

    export const initialState: State = adapter.getInitialState({
      showRegistrations: true,
      loading: false,
      loaded: false,
    });

Это дает мне в моем магазине следующий результат:

store result

Но я на самом деле ищу следующий результат, где хранится каждый идентификатор, и я знаю, сколько раз этот идентификатор был найден конкретно:

enter image description here

Ответы [ 2 ]

0 голосов
/ 03 октября 2019

В ответ на ответ Тима я посмотрел за пределы поля ngrx / entity. Я не должен был сосредоточиться на использовании его в первую очередь, так как ответ был довольно прост.

Я добавил интерфейс, который содержит строку и число. В своем коде я назвал этот ReportCount. Затем в действии loadsuccess я либо добавляю новый reportCount с идентификатором пользователя и устанавливаю для счетчика значение 1, либо для счетчика добавляю 1.

В итоге я получил следующий код, который работает, как и ожидалось:

(я публикую это для других людей, которые могут застрять в той же проблеме)


export interface ReportCount{
  superintendent: string,
  count: number,
};


export interface State {
  reportCounts: ReportCount[],
  showRegistrations: boolean,
  loading: boolean,
  loaded: boolean,
};

export const initialState: State = {
  reportCounts: [],
  showRegistrations: true,
  loading: false,
  loaded: false,
};

export const reducer = createReducer(
  initialState,
  on(RegistrationActions.ShowRegistrations,
    (state, { setShow }) => ({
      ...state,
      showRegistrations: setShow,
    })
  ),

  on(RegistrationSuperintendentsCollectionActions.loadRegistrationSuperintendentCollection, (state) => ({
    ...state,
    loading: true,
  })),
  on(RegistrationSuperintendentsCollectionApiActions.loadRegistrationSuperintendentsSuccess,
    (state, { superintendents }) => {
      const repCount: ReportCount[] = [];
      superintendents.forEach(superintendent => {
        let sup = repCount.find(s => s.superintendent === superintendent);
        sup ? (sup.count = sup.count + 1) : repCount.push({superintendent, count:1});
      })
      return ({
        ...state,
        reportCounts: repCount,
        loading: false,
        loaded: true
      })
    }
  ),
);

export const getShowRegistrations = (state: State) => state.showRegistrations;

export const getLoaded = (state: State) => state.loaded;

export const getLoading = (state: State) => state.loading;

export const getLoadedSuperintendentRegistrations  = (state: State) => state.reportCounts; 
0 голосов
/ 02 октября 2019

@ngrx/entity предназначен для хранения и извлечения сущностей на основе идентификатора. Описанный вами вариант использования не подходит для @ngrx/entity.

...