我试图在样本项目中设置NgRx数据。用例是使用Data Service获取Employee实体并存储它们。所以我将数据服务、采集服务和app模块定义如下。我添加了All Employees主页上的按钮,在数据库中获取所有员工。当我点击All Employees按钮,则未调用终点。似乎我在这里遗漏了一些基本的东西
all-employees.component.html
<h1>All Employees</h1>
<ul>
<li *ngFor="let employee of employees$ | async">{{ employee.lastName }}, {{ employee.firstName }}</li>
</ul>
employee-data.service.ts
@Injectable()
export class EmployeeDataService extends DefaultDataService<Employee> {
constructor(http: HttpClient, httpUrlGenerator: HttpUrlGenerator, logger: Logger) {
super('Employee', http, httpUrlGenerator);
logger.log('Created custom Employee EntityDataService');
}
override getAll(): Observable<Employee[]> {
return this.http.get<Employee[]>('http://localhost:3000/employees');
}
}
和这样的员工服务employee.service.ts
@Injectable({
providedIn: 'root',
})
export class EmployeeService extends EntityCollectionServiceBase<Employee> {
constructor(serviceElementsFactory: EntityCollectionServiceElementsFactory) {
super('Employee', serviceElementsFactory);
}
}
和AppModule,它把所有这些连接在一起app.module.ts
@NgModule({
declarations: [AppComponent],
imports: [
BrowserModule,
HttpClientModule,
RouterModule.forRoot(
[
{
path: 'all_employees',
component: AllEmployeesComponent,
},
],
{ initialNavigation: 'enabledBlocking' }
),
StoreModule.forRoot(reducers, {
metaReducers: !environment.production ? [] : [],
runtimeChecks: {
strictActionImmutability: true,
strictStateImmutability: true,
},
}),
EntityDataModule.forRoot({
entityMetadata: appEntityMetadata,
}),
EffectsModule.forRoot([]),
!environment.production ? StoreDevtoolsModule.instrument() : [],
StoreRouterConnectingModule.forRoot(),
],
providers: [EmployeeDataService],
bootstrap: [AppComponent],
})
export class AppModule {
constructor(entityDataService: EntityDataService, EmployeeDataService: EmployeeDataService) {
entityDataService.registerService('Employee', EmployeeDataService);
}
}
代码:将代码上传到Github并按照以下指令运行
- 克隆repo并安装依赖项
- 启动示例JSON服务器
json-server --watch db.json
- 运行项目
nx serve ngrx-demo
编辑:好吧,这很难检测出来,但实际上NgModule中声明的顺序很重要。我比较了我的一个项目,发现EntityDataModule
是最后加载的,在两者之后:
- StoreModule
- EffectsModule
EffectsModule.forRoot([]),
!environment.production ? StoreDevtoolsModule.instrument() : [],
StoreRouterConnectingModule.forRoot(),
EntityDataModule.forRoot(entityConfig),
这是有道理的,但它是棘手的!此外,要小心命名你的服务,我建议不要使用大写的第一个字母为您的实例:employeeDataService: EmployeeDataService
也许我在你的代码中错过了一些东西,但我没有看到你实际要求服务检索实体的地方。根据我的经验,你不仅需要从适配器中创建一个Observable,还需要调用NgRx Data的一个内置方法,比如:
https://ngrx.io/guide/data
getHeroes() {
this.heroService.getAll();
}
应该发生在这里:https://github.com/pavankjadda/nx-projects/blob/main/apps/ngrx-demo/src/app/all-employees/all-employees.component.ts
所以,如果我没有错,你只需添加这个调用,你的端点应该被触发!欢呼。
阿兰