Angular 使用@ngrx/data,获取;没有实体类型[x]的实体定义;

Angular 使用@ngrx/data,获取;没有实体类型[x]的实体定义;,angular,ngrx,ngrx-data,Angular,Ngrx,Ngrx Data,我试图使用@ngrx/data创建一个简单的角度服务,并且在组件运行时收到实体类型“Position”的错误EntityDefinition. 我的EntityMetadataMap如下所示: const entityMetaData: EntityMetadataMap = { Employee: {}, Position: {} }; const pluralNames = { Employee: 'Employees', Position: 'Positions' }; exp

我试图使用@ngrx/data创建一个简单的角度服务,并且在组件运行时收到实体类型“Position”的错误
EntityDefinition.

我的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);
  }
}
@Injectable({providedIn:'root'})
导出类位置DataService扩展EntityCollectionServiceBase{
构造函数(serviceFactory:EntityCollectionServiceElementsFactory){
超级(“职位”,服务工厂);
}
}
我可以在模块设置和EntityDataModule中设置断点,我可以看到实体定义存在并且设置正确(作为
EntityDataModule.forRoot(entityConfig)
的一部分)

但是,当服务的构造函数激发并调用
super(…)
时,在调试器中,我可以看到传入的
EntityCollectionServiceElementsFactory
中没有EntityDefinitions(请注意,“定义”为空):

我做错了什么?
显然,在启动存储模块和依赖项注入将
EntityCollectionServiceElementsFactory
注入服务之间,出现了一些问题。

要轻松处理实体,下面是一个示例

在您的
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({})
};
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 });
    }
  ),
...
您有一个输入错误:-


它应该是
entityMetadata

在提供配置时,请确保使用属性名
entityConfig
。例如:

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

...

export const entityConfig = {
    entityMetadata: mySampleEntityMetadata,
    pluralNames
};

我不明白你背后的意图。你想用实体创建一个商店吗?基本上,是的。我在查看各种选项,似乎ngrx/data为你处理了很多样板代码。但显然我遗漏了一些东西(我已经查看了我能找到的每个示例,无法发现我遗漏了什么)。这不是一个答案-您单独使用的是
@ngrx/entities
,而不是包装器
@ngrx/data
OP所要求的(以及一个特定的错误)。天哪。这很有效。我的第一个想法是,“这只是一个变量名,谁在乎呢?”…然后我意识到我在导出中使用的是属性速记!嘎。非常感谢。当时我刚刚放弃使用ngrx/数据!