3

我正在尝试使用 @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(...)时,在调试器中,我可以看到传入的没有 EntityDefinitions EntityCollectionServiceElementsFactory(注意“定义”是空的):

在此处输入图像描述

我在这里做错了什么?显然,在 store 模块启动和依赖注入注入EntityCollectionServiceElementsFactory服务之间,出现了问题。

4

3 回答 3

3

你有一个错字:-

它应该是entityMetadata

于 2019-11-06T18:41:31.627 回答
2

为了轻松处理实体,这里有一个例子

在你的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 });
    }
  ),
...
于 2019-11-06T16:49:31.840 回答
1

提供配置时,请务必使用属性名称entityConfig。例如:

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

...

export const entityConfig = {
    entityMetadata: mySampleEntityMetadata,
    pluralNames
};
于 2020-05-17T19:18:07.847 回答