首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >可以手动注入NgZone吗?

可以手动注入NgZone吗?
EN

Stack Overflow用户
提问于 2019-11-22 05:14:19
回答 2查看 1.3K关注 0票数 0

我试图使用Injector注入组件/服务,但其中一个组件/服务需要NgZone作为它的依赖项。来自https://angular.io/api/core/Injector

代码语言:javascript
复制
export MyComponent{
  constructor() {
    const injector = Injector.create({
      providers: [
        { provide: NgZone, deps: [ ] },
        { provide: MyService, deps: [ NgZone ] }
      ]
    });

    this.myService = injector.get(MyService);
  }
}

然后在儿童班:

代码语言:javascript
复制
export MyOtherComponent extends MyComponent {
  constructor() {
    super();
  }

  public helloWorld() {
     this.myService.stuff();
  }
}

但我得到了以下错误:

错误: StaticInjectorErrorMyService -> NgZone:

NullInjectorError:没有NgZone的提供者!在NullInjector.get (core.js:8896)

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

  • 是否有办法像这样手动通过deps提供NgZone
  • 是否有另一种方法来获得“全局”NgZone对象(应该只有一个NgZone实例运行,对吗?)

MyService也是一个降级的服务,并同时在AngularJS和Angular7中使用,不确定这是否改变了什么。

编辑:我之所以要这么做,是因为MyComponent是一个组件基类,它会让extends在上面运行,并在上面扩展许多子类。如果我可以通过在内部手动注入它来这样做,那么我就不需要从子级传递所有这些依赖项。假设我有6-7个依赖项和30+子程序,假设我需要一些新的依赖项,我必须更新其中的每一个.

EN

回答 2

Stack Overflow用户

发布于 2019-11-22 14:53:04

你可以注射注射器-这将是一个单一的依赖。你所有的孩子都可以从这个注射器里得到他们需要的东西。是的,您需要通过继承超级()调用链来提供注入器,但至少这只是一回事。

还有一件事:

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

此注释指出,如果修饰抽象类,则可以在抽象类中使用DI。至于NgZone实例--是的,我相信肯定只有一个,而且我也尝试过一次,但没有想出一个优雅的解决方案。

票数 1
EN

Stack Overflow用户

发布于 2019-11-22 15:15:29

我想我昨晚是脑死亡了。今天早上,在深入挖掘之后,我想我找到了一种获取全局区域的方法,而且它似乎奏效了(它触发了变化检测)。

因为@水请求还假定只有一个NgZone实例,所以我决定在控制台中查看一下,您知道了什么。

然后我试着像这样把全局区域传递给它:

代码语言:javascript
复制
    { provide: NgZone, useValue: Zone },

它给了我一个错误,this.ngZone.runundefined。好的..。深入挖掘,哦,嘿,区域中有一个root对象,嘿,看,一个run函数!

所以我去把代码更新到这里,它起了作用。

代码语言:javascript
复制
    { provide: NgZone, useValue: Zone.root },
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58987921

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档