1

我正在使用 Angular2 和 OpenFin 来构建应用程序。我有一个标记为可注入的服务类,并在 NgModule 中列为提供者。它被注入到组件中,但只有在创建组件时才会实例化我的服务类。我希望在应用程序启动时创建服务类,无论是否创建了我的组件,但是当我的组件被创建时,我预先创建的实例应该被注入到组件中。

我怀疑我想要做的是在启动时创建一个服务实例,然后将它传递给 Angular 以告诉它在任何组件需要它时使用该实例。这是可能的还是我必须依靠 Angular 来实例化我的服务。

谢谢安迪

4

4 回答 4

2

在 AppModule 的提供者元数据中注册您的服务将使该服务可用于应用程序中的任何组件。

import { YourService } from './your-service.service';

@NgModule({
  declarations: [
    AppComponent,
    ...
  ],
  imports: [
    BrowserModule,
    FormsModule,
    HttpModule,
    ...
  ],
  providers: [YourService], // YourService as a provider to the application
  bootstrap: [AppComponent]
})
export class AppModule {
  constructor(private yourService: YourService){
    this.yourService.Init();
  }
}

这与在应用程序启动时向容器注册单例相同。Angular 将负责其余的工作。

希望这可以帮助你!

于 2017-02-11T20:35:29.067 回答
0

为此,只需在如下所示的@ngModule装饰器中注册您的服务,rootcomponent

@NgModule({
  ...
  ...
  providers:[AppService],   //scoped to entire application
  ...
})

现在,只要需要,就可以在任何组件中使用此服务。

注意:不要尝试providers:[AppService]在任何单独的组件中使用/注册。如果您尝试这样做,它将创建一个仅适用于该组件的不同实例。

于 2017-02-11T20:35:45.523 回答
0

Angular DI 是惰性的,但是有一个技巧可以让服务实例化变得急切:你需要实现OnDestroy接口。

于 2017-02-11T20:56:25.010 回答
0

您可以将其提供为APP_INITIALIZER

providers: [{provide: APP_INITIALIZER, useClass: YourService, multi: true}],

https://angular.io/docs/ts/latest/api/core/index/APP_INITIALIZER-let.html

于 2017-02-11T22:19:49.270 回答