Angular 6创建单例服务

时间:2018-07-11 02:05:11

标签: angular authentication angularfire2 angular6

我知道Angular 6中必须创建单例服务的方式已经发生了一些变化。我有一个身份验证服务,需要为访问它的每个组件构造一次。我将提供程序设置为服务的根目录:

@Injectable({
  providedIn: 'root'
})

在我的app.module.ts文件中,我将AuthService设置为NgModule中的提供程序之一。但是,每当我在使用Auth服务的不同组件之间路由时,它都会创建Auth Service的新实例(从第一次调用时清除数据)。如何确保Auth服务仅实例化一次,然后在不同组件之间访问该实例?

2 个答案:

答案 0 :(得分:6)

这是将providerIn添加到服务级别的默认行为。按照Docs

  

providedIn在这里告诉Angular根注入器负责   用于创建HeroService的实例。服务是   只要以这种方式自动为整个   应用程序,无需在任何模块中列出。

就您而言,只需删除 providedIn: 'root' ,然后在module.ts中仅提供以下内容。请参阅以下 answer

答案 1 :(得分:2)

为避免任何其他混乱,您可以通过两种方式创建单例,如文档(singleton-services)所述:

  • 声明应在应用程序根目录中提供服务。
    app:src
    该服务不应再导入任何模块。
  • 将服务包含在AppModule或仅由AppModule导入的模块中。
    这里不需要使用@Injectable({providedIn: 'root'})

在我的情况下,使用JIT时,单例服务无法正常工作(常规ng build / ng serve)。对我来说,它仅在使用AoT时才有效(ng build --aot / ng serve --aot)。