我正在进行typescript-angular项目,其中我创建了一个基类,如下所示:
export abstract class MyClass {
constructor(private toastService?: ToastService) {}
...
}
我在另一个类中扩展了MyClass,如下所示:
export class AcademyDraftListService extends AssessmentsDataService{
constructor() {
super()
}
}
如果我没有从父级传递toastService
,那么在子级中它总是空的。如果父类没有传递回退服务,我可以实现任何其他方法来使用回退服务吗?
我知道对于变量,我们可以在parent中这样做:
constructor(private myVar?: ToastService='some value')
但是如何在Angular中为服务实现同样的事情呢?
2条答案
按热度按时间olhwl3o21#
为了直接回答你,在Angular 16中,你有
inject
函数:不在构造函数中=不需要通过超级调用注入它。
现在,给予我的两个美分的问题:在Angular中,你应该避免扩展类。Angular与装饰器一起工作,没有扩展,它可能会导致非常奇怪的错误。在Angular中使用的正确方法是组合(实现像
OnInit
这样的接口)或依赖注入。因此,与其创建基类,不如创建一个可注入的服务,并像这样使用它:
krugob8w2#
Angular不会向你的父类注入任何服务。你还必须将它添加到子类的构造函数中,并将它传递给父类的构造函数。
也没有什么能像一个后备服务。虽然您可以自己创建一个新的服务示例作为默认值,但您不会使用AngulsDependencies注入,这可能会导致问题或复杂,如果服务也有dependencies。
或者,您可以尝试使用Angulars Injector来获取服务,尽管您还需要将其注入到您的子类中或创建一个新示例。
最佳实践是在构造函数中将服务从子类传递到父类。