Angular NGRX Entity, подсчитывающий один и тот же объект

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

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

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

Массив идентификаторов людей

Здесь у меня дважды одинаковый идентификатор, что означает, что у этого человека 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,
    });

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

магазин результат

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

введите здесь описание изображения


person James D    schedule 02.10.2019    source источник
comment
Думаю, для этого вам понадобится специальный редуктор. Первый объект теперь будет просто перезаписан вторым (что вы обычно и хотите).   -  person MikeOne    schedule 02.10.2019
comment
Я думаю, вы должны иметь возможность просто использовать Effects для управления объектом, чтобы он содержал свойство OutstandingReports для каждого идентификатора   -  person penleychan    schedule 02.10.2019


Ответы (2)


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

person timdeschryver    schedule 02.10.2019

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

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

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

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


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; 
person James D    schedule 03.10.2019