繁体   English   中英

Angular 7+ - 注入和子类

[英]Angular 7+ - Injection and Subclass

通常,当您有一些可注入的服务要使用时,您会编写如下内容:

export class MyClass {
 constructor(
                private _myservice: MyService)
  { }
  [...]
}

不幸的是,当你扩展 MyClass 时,子构造函数在调用 super 时需要注入相同的服务。

export class MyClassSon extends MyClass {
   constructor()
   {
       super(); <<<---- ERROR!!!!
   }

我很困惑。 我使用 SuperClass 来允许子类访问可注入服务,而无需自己注入它们。

我找到的最佳解决方案是 Injector:

export class MyClass {
     constructor(
                    injector: Injector)
      { 
          this._myservice = injector.get(MyService);
          this._fooservice = injector.get(FooService);
          //others services...
    }
}

export class MyClassSon extends MyClass {
       constructor(injector: Injector)
       {
           super(injector);
           //I can use any other services
       }

这最大限度地减少了超级调用的复杂性,但我仍然很生气,我需要做这个技巧。

有没有另一种方法可以在不使用 costructor 的情况下在 class 中注入一些东西,这样我就可以让它尽可能干净并且只用于特定组件的初始化?

如果你绝对想让你的构造函数保持干净,你可以使用 CoreModule 的 static 字段中的注入器(例如)。 不建议这样做,但它有效。

首先,您应该必须从您的 CoreModule/AppModule (root) 中检索您的 Injector

export class CoreModule {
  public static injector: Injector;

  public constructor(injector: Injector) {
    CoreModule.injector = injector;
  }
}

在 MyClass 里面

export class MyClass {
  public constructor() {
    this.myService = CoreModule.injector.get(MyService)
  }
}

在 MyClassSon 里面

export class MyClassSon extends MyClass {
  public constructor() {
    super(); // required for invoke parent build
  }
}

您可以在 MyClass 中使用另一种不需要从子级调用 super() 构造函数的替代方法。

export class MyClass implements OnInit {
  public ngOnInit() {
    this.myService = CoreModule.injector.get(MyService)
  }
}

但是对于最后一个,请注意不要在不调用父级的情况下在子级中覆盖 ngOnInit 方法。

此解决方案不符合最佳实践,但工作正常。


编辑

使用抽象 class。

export abstract class MyClass {
  protected abstract get myService();
}
export class MyClassSon extends MyClass {
  protected get myService() {
    return this._myService;
  }

  public construction(private _myService: MyService) {

  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM