首页 > 解决方案 > 可以手动注入 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)

我尝试了一个在构造函数中没有任何东西的虚拟服务,它起作用了。

MyService也是一个降级的服务,并且在 AngularJS 和 Angular7 中都被使用,不确定这是否会改变任何东西。

编辑:我试图这样做的原因是因为MyComponent它是一个组件基类,它会extends在上面扩展许多子类。如果我可以通过在内部手动注入来做到这一点,那么我不需要从孩子那里传递所有这些依赖项。想象一下,我有 6-7 个依赖项和 30 多个子项,假设我需要一些新的依赖项,我必须更新它们中的每一个......

标签: angular7

解决方案


你可以注入注入器——这将是一个单一的依赖。然后,您所有的孩子都可以从这个注射器中得到他们需要的东西。是的,您需要通过 super() 调用的继承链提供该注入器,但至少它只是一件事。

还有这个:

https://github.com/angular/angular/issues/16566#issuecomment-338188342

此评论指出,如果您装饰抽象类,则可以在抽象类中使用 DI。至于 NgZone 实例——是的,我相信肯定只有一个,我也尝试过一次,但无法提出一个优雅的解决方案。


推荐阅读