[英]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.