我有课程parent
和child
。 child
类扩展了parent
。我需要@Inject
注入类service
到parent
,因为所有child
都在使用它。我怎么能这样做?
答案 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);
}
}