在 Angular 中导入时如何从模块自动运行服务?

Mac*_*ado 4 typescript angular

我想知道如何在没有任何手动服务注入和运行的情况下从模块中运行服务,就像这样RouterModule做一样。

@NgModule({
  imports: [

    BroserModule,
    MyModuleWithServicesThatShouldAutoRun,

  ]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

Mac*_*ado 5

免责声明:这是基于另一个没有被接受为正确答案的答案,因为有一种更简单、更容易的方法来完成 OP 所需的操作。

您可以使用APP_INITIALIZER注入令牌在任何其他应用程序代码运行之前运行初始化代码。

APP_INITIALIZER定义在@angular/core,您可以像这样包含它:

import { APP_INITIALIZER } from '@angular/core';
Run Code Online (Sandbox Code Playgroud)

APP_INITIALIZER是一个OpaqueToken引用 多提供者 ApplicationInitStatus服务。它支持多个依赖项,您可以在提供者列表中多次使用它,例如:

@NgModule({
  providers: [
    MyService,
    {
      provide: APP_INITIALIZER,
      useFactory: (service: MyService) => function() { return service.init(); },
      deps: [MyService],
      multi: true
    }]
})
export class AppModule { }
Run Code Online (Sandbox Code Playgroud)

此提供程序声明告诉ApplicationInitStatus类运行该MyService.init()方法。init()返回 aPromiseApplicationInitStatus阻止应用程序启动,直到Promise解决为止。

export class MyService {

  // omitted other methods for brevity

  init(): Promise<any> {

    // start some observers, do the stuff you need

    // you can even request something via http
    return this.httpClient
      .get('https://someurl.com/example')
      .toPromise()
  }

}
Run Code Online (Sandbox Code Playgroud)

这样,init 中的任何内容都将运行并阻止应用程序加载,直到Promise解决为止。

请注意,无论该init()方法需要多长时间,这都会增加您的应用程序的前期加载时间。要在打开路由之前加载内容,您应该改用解析器

资料来源: