Использование @ ngrx / data, получение No EntityDefinition для типа сущности [x]

Я пытаюсь использовать @ ngrx / data для создания простой службы в Angular и получаю сообщение об ошибке EntityDefinition for entity type "Position". при запуске компонента.

Моя EntityMetadataMap такова:

const entityMetaData: EntityMetadataMap = {
  Employee: {},
  Position: {}
};

const pluralNames = { Employee: 'Employees', Position: 'Positions' };

export const entityConfig = {
  entityMetaData,
  pluralNames,
};

а мой модуль магазина таков:

@NgModule({
  declarations: [],
  imports: [
    StoreModule.forRoot({}),
    EffectsModule.forRoot([]),
    StoreDevtoolsModule.instrument(),
    EntityDataModule.forRoot(entityConfig),
  ],
  providers: [
    {provide: DefaultDataServiceConfig, useValue: defaultDataServiceConfig},
    PositionsDataService
  ]

})
export class ItwStoreModule {
  constructor() {
    console.log(entityConfig);
  }
}

и моя служба данных для позиции такова:

@Injectable({ providedIn: 'root' })
export class PositionsDataService extends EntityCollectionServiceBase<Position> {
  constructor(serviceFactory: EntityCollectionServiceElementsFactory) {
    super('Position', serviceFactory);
  }
}

Я могу поставить точку останова в настройке модуля и в EntityDataModule, и я вижу, что определение сущности существует и устанавливается правильно (как часть EntityDataModule.forRoot(entityConfig).

Но когда конструктор службы запускается и вызывает super(...) в отладчике, я вижу, что в переданном EntityCollectionServiceElementsFactory нет EntityDefinitions (обратите внимание, что «определения» пусты):

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

Что я здесь делаю не так? Очевидно, что между запуском модуля хранилища и внедрением зависимостей EntityCollectionServiceElementsFactory в службу что-то идет не так.


person CleverPatrick    schedule 06.11.2019    source источник
comment
Я не понимаю твоего намерения. Вы хотите создать магазин с сущностями?   -  person Wandrille    schedule 06.11.2019
comment
в значительной степени да. Я рассматривал различные варианты, и, похоже, ngrx / data обрабатывает для вас много шаблонного кода. Но, очевидно, я что-то упускаю (я просмотрел все примеры, которые смог найти, и не мог определить, что мне не хватает).   -  person CleverPatrick    schedule 06.11.2019
comment
Воспроизведение ошибки в Stackblitz   -  person Andrew Allen    schedule 06.11.2019


Ответы (3)


У вас опечатка: -

Это должно быть entityMetadata

person Andrew Allen    schedule 06.11.2019
comment
МОЙ БОГ. Это сработало. Моей первой мыслью было, что это просто имя переменной, кого это волнует ... потом я понял, что использую сокращение свойств при экспорте! ГАХ. Большое спасибо. На тот момент я только что отказался от использования ngrx / data! - person CleverPatrick; 06.11.2019

Чтобы легко работать с сущностями, вот пример

В вашем store.states.ts

export interface State {
    store_A: STATE_A;
}

export interface STATE_A extends EntityState<ClassA> {}

export const adapter: EntityAdapter<ClassA> = createEntityAdapter<ClassA>({
    selectId: (params: ClassA) => params.id
});

export const initialState: State = {
    store_A: aAdapter.getInitialState({})
};

В вашем store.selector.ts

export const getMainState = createFeatureSelector<State>('root-feature');

export const getStateA = createSelector(getMainState , (state) => state.stateA);

export const getAllStateA = createSelector(getStateA , (state) => adapter.getSelectors().selectAll);

В вашем сервисе или компоненте:

this.store.select(getAllStateA) // Observable of all item A

В вашем редукторе:

...
  on(
    MyAction,
    (state, { itemAs }) => {
      return adapter.addAll(itemAs , { ...state });
    }
  ),
...
person Wandrille    schedule 06.11.2019
comment
Это не ответ - вы используете только @ngrx/entities, а не оболочку, которую запрашивает @ngrx/data OP (вместе с конкретной ошибкой). - person Andrew Allen; 06.11.2019

При предоставлении конфигурации обязательно используйте имя свойства entityConfig. Например:

const mySampleEntityMetadata : EntityMetadataMap = {
    Hero: {},
    Villain: {}
};

...

export const entityConfig = {
    entityMetadata: mySampleEntityMetadata,
    pluralNames
};
person Amit    schedule 17.05.2020