我试图使用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();
}
}但我得到了以下错误:
错误: StaticInjectorErrorMyService -> NgZone:
NullInjectorError:没有NgZone的提供者!在NullInjector.get (core.js:8896)
我尝试使用一个没有构造函数中任何内容的虚拟服务,它起了作用。
deps提供NgZone?。
MyService也是一个降级的服务,并同时在AngularJS和Angular7中使用,不确定这是否改变了什么。
编辑:我之所以要这么做,是因为MyComponent是一个组件基类,它会让extends在上面运行,并在上面扩展许多子类。如果我可以通过在内部手动注入它来这样做,那么我就不需要从子级传递所有这些依赖项。假设我有6-7个依赖项和30+子程序,假设我需要一些新的依赖项,我必须更新其中的每一个.
发布于 2019-11-22 14:53:04
你可以注射注射器-这将是一个单一的依赖。你所有的孩子都可以从这个注射器里得到他们需要的东西。是的,您需要通过继承超级()调用链来提供注入器,但至少这只是一回事。
还有一件事:
https://github.com/angular/angular/issues/16566#issuecomment-338188342
此注释指出,如果修饰抽象类,则可以在抽象类中使用DI。至于NgZone实例--是的,我相信肯定只有一个,而且我也尝试过一次,但没有想出一个优雅的解决方案。
发布于 2019-11-22 15:15:29
我想我昨晚是脑死亡了。今天早上,在深入挖掘之后,我想我找到了一种获取全局区域的方法,而且它似乎奏效了(它触发了变化检测)。
因为@水请求还假定只有一个NgZone实例,所以我决定在控制台中查看一下,您知道了什么。

然后我试着像这样把全局区域传递给它:
{ provide: NgZone, useValue: Zone },它给了我一个错误,this.ngZone.run是undefined。好的..。深入挖掘,哦,嘿,区域中有一个root对象,嘿,看,一个run函数!

所以我去把代码更新到这里,它起了作用。
{ provide: NgZone, useValue: Zone.root },https://stackoverflow.com/questions/58987921
复制相似问题