使用@ngrx/data,得到"No EntityDefinition for entity type [x]"
Using @ngrx/data, getting "No EntityDefinition for entity type [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(注意 "definitions" 为空):
我在这里做错了什么?
显然,在启动商店模块和依赖注入将 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({})
};
在你的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 });
}
),
...
你打错了:-
应该是entityMetadata
提供配置时,请务必使用 属性 名称 entityConfig
。例如:
const mySampleEntityMetadata : EntityMetadataMap = {
Hero: {},
Villain: {}
};
...
export const entityConfig = {
entityMetadata: mySampleEntityMetadata,
pluralNames
};
我正在尝试使用@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(注意 "definitions" 为空):
我在这里做错了什么?
显然,在启动商店模块和依赖注入将 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({})
};
在你的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 });
}
),
...
你打错了:-
应该是entityMetadata
提供配置时,请务必使用 属性 名称 entityConfig
。例如:
const mySampleEntityMetadata : EntityMetadataMap = {
Hero: {},
Villain: {}
};
...
export const entityConfig = {
entityMetadata: mySampleEntityMetadata,
pluralNames
};