【问题标题】:Angular service call a child method in constructorAngular服务在构造函数中调用子方法
【发布时间】:2020-06-12 04:32:28
【问题描述】:

有没有办法从抽象服务调用子类方法?当我这样做时,if 语句不会执行,因为onInit 不存在。我不确定为什么它不存在。也许有一种“角度”的方式来做到这一点,而不是在初始化时触发它。或者,也许我只需要在组件中手动调用 onInit。基本上我正在做的是尝试从服务器获取初始应用程序数据。

@Injectable({providedIn:'root'})
export class RootService {
  public constructor(httpClient: HttpClient) {
    if(typeof this.onInit === 'function') {
      this.onInit()
    }
  }
}
@Injectable({providedIn:'root'})
export class MyService extends RootService {
  public onInit() {
    // Do stuff
  }
}
@Component()
export MyComponent {
  public constructor(myService: MyService) {}
}

【问题讨论】:

  • RootService 怎么知道MyService 甚至存在?你想完成什么,也许还有其他方法

标签: javascript angular typescript


【解决方案1】:

服务没有生命周期事件。但是组件have lifecycle hooks如:

  • ngOnChanges()
  • ngOnInit()
  • ngDoCheck()
  • ...

因此您可以在组件初始化时加载数据。如果是,那么只需使用ngOnInit

import { Component, OnInit } from '@angular/core';

@Component()
export MyComponent  implements OnInit {
    yourData;

    public constructor(myService: MyService) {}

    ngOnInit(){
        myService.loadData()
            .subscribe(s=> yourData = s);
    }
}

According to Angular docs:

OnInit 是一个生命周期钩子,在 Angular 之后调用 已初始化指令的所有数据绑定属性。

【讨论】:

  • 我想要的是在服务初始化时加载数据。也许这不是正确的方法......
  • @GetOffMyLawn 你想在服务中缓存这些数据吗?服务初始化的时候你要加载数据干什么?
  • 我在服务中有变量,当数据加载时,它会保存到变量中。
  • @GetOffMyLawn 然后您可以从组件调用服务并将此数据保存到此服务的变量中。
  • 看起来我希望它在模块中使用APP_INITIALIZER 提供程序。加载此数据。
【解决方案2】:

如果您将服务添加到组件的提供者,它将在您的组件范围内,那么您也可以在您的服务中调用 onInit。

但这样做的缺点是您不能再在组件之间共享同一个服务实例。

如果您的服务仅服务于一个组件,这将是有效的。

【讨论】:

    猜你喜欢
    • 2019-05-02
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-31
    • 2018-06-22
    相关资源
    最近更新 更多