如何在Angular-Typescript项目的抽象类中使用回退服务

vqlkdk9b  于 2023-06-24  发布在  TypeScript
关注(0)|答案(2)|浏览(177)

我正在进行typescript-angular项目,其中我创建了一个基类,如下所示:

  1. export abstract class MyClass {
  2. constructor(private toastService?: ToastService) {}
  3. ...
  4. }

我在另一个类中扩展了MyClass,如下所示:

  1. export class AcademyDraftListService extends AssessmentsDataService{
  2. constructor() {
  3. super()
  4. }
  5. }

如果我没有从父级传递toastService,那么在子级中它总是空的。如果父类没有传递回退服务,我可以实现任何其他方法来使用回退服务吗?
我知道对于变量,我们可以在parent中这样做:

  1. constructor(private myVar?: ToastService='some value')

但是如何在Angular中为服务实现同样的事情呢?

olhwl3o2

olhwl3o21#

为了直接回答你,在Angular 16中,你有inject函数:

  1. export class MyBaseClass {
  2. private toaster = inject(ToasterService);
  3. }

不在构造函数中=不需要通过超级调用注入它。
现在,给予我的两个美分的问题:在Angular中,你应该避免扩展类。Angular与装饰器一起工作,没有扩展,它可能会导致非常奇怪的错误。在Angular中使用的正确方法是组合(实现像OnInit这样的接口)或依赖注入。
因此,与其创建基类,不如创建一个可注入的服务,并像这样使用它:

  1. export class MyBaseClass {
  2. doSomething() {}
  3. }
  4. export class MySubClass {
  5. private base = inject(MyBaseClass);
  6. doSomething = this.base.doSomething.bind(this.base);
  7. }
展开查看全部
krugob8w

krugob8w2#

Angular不会向你的父类注入任何服务。你还必须将它添加到子类的构造函数中,并将它传递给父类的构造函数。

  1. export abstract class MyParentClass {
  2. constructor(private myService?: MyService) {}
  3. ...
  4. }
  5. export class MyClass extends MyParentClass {
  6. constructor(myService?: MyService) {
  7. super(myService);
  8. }
  9. ...
  10. }

也没有什么能像一个后备服务。虽然您可以自己创建一个新的服务示例作为默认值,但您不会使用AngulsDependencies注入,这可能会导致问题或复杂,如果服务也有dependencies。

  1. export abstract class MyParentClass {
  2. constructor(private myService: MyService = new MyService()) {}
  3. ...
  4. }

或者,您可以尝试使用Angulars Injector来获取服务,尽管您还需要将其注入到您的子类中或创建一个新示例。
最佳实践是在构造函数中将服务从子类传递到父类。

展开查看全部

相关问题