【发布时间】:2018-07-20 11:46:57
【问题描述】:
我在注入使用异步工厂提供程序创建的依赖项时遇到问题。
我有以下配置:
app.modules:
@NgModule({
declarations: [
...
...,
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
HttpModule,
HttpClientModule,
...
UsersModule.forRoot(),
...
APP_ROUTERS
]
})
export class AppModule {}
APP_ROUTERS:
const rootRouters = [
{path: '', redirectTo: 'tests', pathMatch: 'full'},
{
path: 'users/login',
component: SUserLoginComponent,
resolve: {
localUsers: UsersLocalResolver
},
},
{
path: '',
loadChildren: 'app/test/test.module#TestModule',
canActivate: [SecurityAuthenticationGuard],
data: {
preload: true
}
},
];
export const APP_ROUTERS: ModuleWithProviders = RouterModule.forRoot(rootRouters, {onSameUrlNavigation: 'reload'});
user.modules:
@NgModule({
imports: [
CommonModule,
...
],
declarations: [
SUserLoginComponent,
],
exports: [
SUserLoginComponent
]
})
export class UsersModule {
static forRoot(): ModuleWithProviders {
return {
ngModule: UsersModule,
providers: [
UsersLocalResolver,
{
provide: UsersLocalDbServices,
useFactory: (dbservice: IndexedDBService): Promise<UsersLocalDbServices> => {
console.log('Factory UsersLocalDbServices');
return new Promise<UsersLocalDbServices>(async (resolve) => {
if (dbservice.getVersion() === null) {
await dbservice.open(LOCAL_DATABASE_NAME);
}
const instance = new UsersLocalDbServices(dbservice);
const result = await instance.setup();
resolve(instance);
});
},
deps: [IndexedDBService]
}
]
};
}
}
使用异步工厂的服务(UsersLocalDbServices)被注入到SUserLoginComponent组件中,但在组件实例化后才被解析。 是怎么做到的,让实例在创建组件的时候就存在?
export class SUserLoginComponent implements OnInit, AfterViewInit {
constructor(private router: Router,
private activatedRoute: ActivatedRoute,
private db: IndexedDBService,
private securityServices: SecurityServices,
private usersLocalDbService: UsersLocalDbServices) {
}
}
问题在于“usersLocalDbService”是一个承诺,而不是服务实例。
我已经通过执行以下操作解决了它,但事实是它很可怕:
async ngOnInit() {
this.usersLocalDbService = await this.usersLocalDbService;
}
有没有办法注入一个由异步工厂实例化的依赖,并且在创建组件之前解决依赖?
【问题讨论】:
标签: angular asynchronous dependency-injection async-await factory