簡體   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