angular7 - 可以手动注入 NgZone 吗?
问题描述
我正在尝试用来Injector
注入我的组件/服务,但其中一个需要NgZone
作为它的依赖项。来自https://angular.io/api/core/Injector
export MyComponent{
constructor() {
const injector = Injector.create({
providers: [
{ provide: NgZone, deps: [ ] },
{ provide: MyService, deps: [ NgZone ] }
]
});
this.myService = injector.get(MyService);
}
}
然后在子班:
export MyOtherComponent extends MyComponent {
constructor() {
super();
}
public helloWorld() {
this.myService.stuff();
}
}
但我收到以下错误:
ERROR 错误:StaticInjectorError[MyService -> NgZone]:
NullInjectorError:没有 NgZone 的提供者!在 NullInjector.get (core.js:8896)
我尝试了一个在构造函数中没有任何东西的虚拟服务,它起作用了。
- 有没有办法
NgZone
通过类似的方式手动提供deps
? - 是否有另一种方法来获取“全局” NgZone 对象(应该只有 1 个 NgZone 实例正在运行?)
MyService
也是一个降级的服务,并且在 AngularJS 和 Angular7 中都被使用,不确定这是否会改变任何东西。
编辑:我试图这样做的原因是因为MyComponent
它是一个组件基类,它会extends
在上面扩展许多子类。如果我可以通过在内部手动注入来做到这一点,那么我不需要从孩子那里传递所有这些依赖项。想象一下,我有 6-7 个依赖项和 30 多个子项,假设我需要一些新的依赖项,我必须更新它们中的每一个......
解决方案
你可以注入注入器——这将是一个单一的依赖。然后,您所有的孩子都可以从这个注射器中得到他们需要的东西。是的,您需要通过 super() 调用的继承链提供该注入器,但至少它只是一件事。
还有这个:
https://github.com/angular/angular/issues/16566#issuecomment-338188342
此评论指出,如果您装饰抽象类,则可以在抽象类中使用 DI。至于 NgZone 实例——是的,我相信肯定只有一个,我也尝试过一次,但无法提出一个优雅的解决方案。
推荐阅读
- javascript - Angular JS 脚本在尝试从 Spring Boot 控制器接收响应时抛出 $http:baddata
- c# - C# .Where & .Select
- python - for 循环坏了,但调试器找不到任何问题
- mysql - 用于查找可以访问最多课程房间的两位教师的 SQL 查询
- windows - 在 Windows 机器上运行 Postgresql 11 时导致“更多无法识别...”错误的原因是什么?
- amazon-web-services - 使用 Apache Airflow 编辑存储在 AWS S3 中的 CSV,无需下载
- protractor - 角度测试 - 将 Jest 与量角器一起使用
- angular - 模态控制器在离子科尔多瓦中不起作用
- sql-server - 如何在 AVG() 函数 SQL Server 中表示 0.5 或 1/2
- visual-studio-code - VSCode 一些快捷键不能正常工作