【问题标题】:How to await service ready Angular?如何等待服务准备好Angular?
【发布时间】:2019-12-27 19:01:09
【问题描述】:

内部根组件初始化了第一次单音服务。

export class AppComponent {
  constructor(private reonMapLibraryService: ReonMapLibraryService) {
}
}

然后在子组件中我尝试准备好实例:

export class SearchFilterComponent implements OnInit, AfterViewInit {
   constructor(private reonMapLibraryService: ReonMapLibraryService) {}
   ngAfterViewInit(): void {
    this.layers = this.reonMapLibraryService.layersManager.getRegistryTree();
  }
}

它说reonMapLibraryServiceundefined,因为首先 ar 加载了子组件。

子组件如何等待服务?

【问题讨论】:

    标签: angular angular5 angular8


    【解决方案1】:

    如果您需要在应用初始化之前等待准备就绪的服务或异步预取一些数据,最好的地方是APP_INITIALIZER。应用程序应在初始化程序执行期间等待,并且仅在初始化程序解决后才会启动。您可以像这样使用它(让我们将初始化程序直接放在 AppModule 中):

    export function init_app(reonMapLibraryService: ReonMapLibraryService) {
      return async () => await reonMapLibraryService.fetchData();
    }
    
    @NgModule({
      declarations: [...],
      imports: [...],
      providers: [
        ...,
        ReonMapLibraryService,
        {
          provide: APP_INITIALIZER,
          useFactory: init_app,
          deps: [ReonMapLibraryService],
          multi: true
        }
      ]
    })
    

    就是这样。它应该等待fetchData 方法的执行,并仅在它被解析后引导应用程序。

    【讨论】:

    • 它不是异步的,它只是:fetchData() { return this.mapApi = new ReonMapApi(mapContainer); }
    • 我尝试从另一个库 Angular 初始化服务,然后我尝试在 Angular 的另一部分的组件中使用这个准备好的对象
    • 我也不能使用导出函数 init_app(reonMapLibraryService: ReonMapLibraryService) {}` 因为我需要传递对模板 HTML 的引用作为初始化参数
    • 你检查过这个第三方库的文档吗?也许他们以某种特定方式初始化该服务?
    • 据我了解,您可以在 AppComponent 中初始化和使用服务而没有错误?如果您从子组件中删除它 - 没有错误?您还可以分享指向您正在使用的库的文档的链接吗?
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2019-02-18
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 1970-01-01
    相关资源
    最近更新 更多