强制Angular 2子模块中的服务实例化(AngularJS运行块的替代方案)
Force service instantiation in Angular 2 sub-module (an alternative to AngularJS run block)
我在子模块中有一个服务,它封装了一些第三方模块,实例化并初始化其服务,为在应用程序中使用做准备。
@Injectable()
class SubmoduleInitializerService {
constructor (thirdPartyService: ThirdPartyService) {
thirdPartyService.initialize(...);
...
}
}
@NgModule({
imports: [ThirdPartyModule],
exports: [ThirdPartyModule],
providers: [
ThirdPartyService,
SubmoduleInitializerService
]
})
class AppSubmodule {}
ThirdPartyService
不是直接注入到应用程序中,而是被其他ThirdPartyModule
单元使用,所以只要SubmoduleInitializerService
与ThirdPartyService
或父注射器在同一个注射器中注入,一切都很好:
export class AppComponent {
constructor(
/* DO NOT REMOVE! BAD THINGS HAPPEN! */
submoduleInitializerService: SubmoduleInitializerService
) {}
...
}
它被证明是一个糟糕的模式,因为如果SubmoduleInitializerService
既没有在类中也没有在模板中使用(已经意外删除过一次(,那么它为什么应该保留在AppComponent
中注入还不清楚。
基本上AppSubmodule
模块需要Angular 1.x angular.module(...).run(...)
块的替代方案。
这里有什么选择?
APP_INITIALIZER
(未记录(服务在Angular 2中相当好地扮演了AngularJS配置/运行块的角色(不包括异步初始化的特性(。
对于只是急切地实例化SubmoduleInitializerService
的noop初始化块,它是:
@NgModule({
imports: [ThirdPartyModule],
exports: [ThirdPartyModule],
providers: [
ThirdPartyService,
SubmoduleInitializerService,
{
provide: APP_INITIALIZER,
useFactory: () => () => {},
deps: [SubmoduleInitializerService],
multi: true
}
]
})
class AppSubmodule {}
由于APP_INITIALIZER
是多提供程序,它允许每个应用程序具有多个初始化函数,这些函数遵循加载模块的顺序。
对于同步初始化,较短(可能更合适(的替代方案是将服务注入模块的构造函数:
@NgModule({
imports: [ThirdPartyModule],
exports: [ThirdPartyModule],
providers: [
ThirdPartyService,
SubmoduleInitializerService
]
})
class AppSubmodule {
constructor(sis: SubmoduleInitializerService) {}
}
正如这个答案中所解释的,APP_INITIALIZER
也与config
块共享一些特性,因为它用于在组件初始化之前配置服务,并且容易受到竞争条件的影响(例如,由于APP_INITIALIZER
用于配置Router
,将其注入另一个APP_INITIALIZER
将导致循环依赖(。
- Angularjs代码未在匿名函数中运行
- 如何在angularJS中运行for循环而不使用html标记
- angularjs ng点击运行时标记不起作用
- 正在尝试让AngularJS/SCSS代码笔在本地运行.
- 使用 angularjs 在 24 小时后自动运行弹出窗口
- 在子控制器中触发时,Ionic AngularJS父动画未正确运行
- Angularjs推迟了日志运行计时器任务
- AngularJS这样的开源Javascript是如何在客户端浏览器上运行的
- AngularJS/Protactor:使用角种子基本应用程序运行量角器时出错
- 如何在Eclipse中运行和调试AngularJS应用程序
- 使用 heroku 运行 angularjs 种子应用程序时出错
- 无法运行 AngularJS 计时器示例
- 获取我的页面开始运行 angularjs 的时间
- 关于在IE8的iFrame中运行AngularJS应用程序的空白页
- 推迟在应用程序运行angularjs上创建控制器/服务
- $digest已经运行- AngularJS
- 如何运行angularjs ajax请求在循环,但有延迟
- c# WPF应用程序浏览器不能运行angularjs
- 在ie7上运行AngularJS应用
- 在iOS和OSX的专属网络助手(WISPr)中运行angularJS