APP_INITIALIZER https://angular.io/docs/ts/latest/api/core/index/APP_INITIALIZER-let.html(未记录的)服务在 Angular 2 中很好地扮演了 AngularJS 配置/运行块的角色(不包括异步初始化的功能)。
对于只是急于实例化的 noop 初始化块SubmoduleInitializerService
it is:
@NgModule({
imports: [ThirdPartyModule],
exports: [ThirdPartyModule],
providers: [
ThirdPartyService,
SubmoduleInitializerService,
{
provide: APP_INITIALIZER,
useFactory: () => () => {},
deps: [SubmoduleInitializerService],
multi: true
}
]
})
class AppSubmodule {}
Since APP_INITIALIZER
是多提供商的,它允许每个应用程序有多个初始化函数,这些初始化函数遵循模块加载的顺序。
对于同步初始化,更短(可能更合适)的替代方案是将服务注入到模块的构造函数中:
@NgModule({
imports: [ThirdPartyModule],
exports: [ThirdPartyModule],
providers: [
ThirdPartyService,
SubmoduleInitializerService
]
})
class AppSubmodule {
constructor(sis: SubmoduleInitializerService) {}
}
正如中所解释的这个答案 https://stackoverflow.com/a/43827191/3731501, APP_INITIALIZER
与以下人员有一些共同特征config
块,也是因为它用于在组件初始化之前配置服务并且容易受到竞争条件的影响(例如,因为APP_INITIALIZER
用于配置Router
,将其注入另一个APP_INITIALIZER
将导致循环依赖)。