以角度为单位向父类注入依赖服务

时间:2017-12-16 16:56:24

标签: angular typescript

我有课程parentchildchild类扩展了parent。我需要@Inject注入类serviceparent,因为所有child都在使用它。我怎么能这样做?

3 个答案:

答案 0 :(得分:3)

您无法将依赖项注入父类,因为Angular不会为您实例化它。它创建了一个子类的实例,它有效地初始化了父类(这并不是非常准确,因为类只是语法糖,但它适合于这个讨论)。

一个常见的解决方案是将子类设置为可注入,然后使用os := StringToOleStr(FFileName); LInitializeWithFile.Initialize(os, STGM_READ); SysFreeString(os); 向上传递依赖项。 e.g:

super

如果class Parent { constructor(protected someService: SomeService) { } } @Injectable() class Child extends Parent { constructor(someService: SomeService) { super(someService); } } 实际上并不需要依赖本身,那么您最好只在您的子类上使用Parent,这些子类可能有自己的依赖项私有引用。

答案 1 :(得分:2)

您可以使用CvvHelpDialog cvvDialog = new CvvHelpDialog(getActivity()); cvvDialog.show(); 类从父级注入任何服务或类,您需要从子级注入Injector类并通过Injector将其传递给父级,以便父级可以注入您的注入器提供的可重用服务来自儿童。

父类:

super(injector)

儿童班:

export class BaseComponent implements OnInit {

    protected myService: MyService

    constructor(injector: Injector) {
        this.myService = injector.get(MyService)
    }

    ngOnInit() {
        console.log('ngOnInit from Base');
    }
}

使用这种方式,您不想将每个服务从子级注入,都希望一个接一个地传递给父级,上述方法从父级注入更有效。

答案 2 :(得分:0)

如果要避免将注入器或注入的实例从子类重复传递到父类,则可以使用此解决方案。

使用单个静态属性创建一个类:

export class AppModuleServices{
    static injector: Injector;
}

然后在创建服务的模块中设置注射器的值:

import {Injector, NgModule} from '@angular/core';    
@NgModule({
      providers: MyService
    })
    export class AppModule {
      constructor(private injector: Injector) {
        AppModuleServices.injector = this.injector;
      }
    }

只要实例化了模块,您现在就可以在任何类中使用静态注入器并检索模块的任何服务:

export class MyParentClass {
  private myService: MyService;

  constructor () {
     this.myService = AppModuleServices.get<MyService>(MyService);
  }
}