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