首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 7+ - Injection和子类

Angular 7+ - Injection和子类
EN

Stack Overflow用户
提问于 2019-11-21 01:09:51
回答 1查看 336关注 0票数 2

通常,当您有一些想要使用的可注入服务时,您可以编写如下代码:

代码语言:javascript
复制
export class MyClass {
 constructor(
                private _myservice: MyService)
  { }
  [...]
}

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

代码语言:javascript
复制
export class MyClassSon extends MyClass {
   constructor()
   {
       super(); <<<---- ERROR!!!!
   }

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

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

代码语言:javascript
复制
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的情况下在类中注入一些东西,这样我就可以尽可能地让它保持干净,并且只对特定的组件进行初始化?

EN

回答 1

Stack Overflow用户

发布于 2019-11-21 02:02:51

如果你绝对想保持构造函数整洁,你可以使用CoreModule静态字段中的注入器(例如)。不推荐这样做,但它是有效的。

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

代码语言:javascript
复制
export class CoreModule {
  public static injector: Injector;

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

MyClass内幕

代码语言:javascript
复制
export class MyClass {
  public constructor() {
    this.myService = CoreModule.injector.get(MyService)
  }
}

MyClassSon内幕

代码语言:javascript
复制
export class MyClassSon extends MyClass {
  public constructor() {
    super(); // required for invoke parent build
  }
}

您可以在MyClass中使用另一种方法,它不需要从子对象调用超级()构造函数。

代码语言:javascript
复制
export class MyClass implements OnInit {
  public ngOnInit() {
    this.myService = CoreModule.injector.get(MyService)
  }
}

但对于最后一个方法,请注意不要在未调用父方法的情况下重写子方法中的ngOnInit方法。

此解决方案不符合最佳实践,但运行良好。

编辑

使用抽象类。

代码语言:javascript
复制
export abstract class MyClass {
  protected abstract get myService();
}
代码语言:javascript
复制
export class MyClassSon extends MyClass {
  protected get myService() {
    return this._myService;
  }

  public construction(private _myService: MyService) {

  }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58959826

复制
相关文章

相似问题

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