Angular6 创建单例服务

Angular 6 Creating Singleton Service

我知道 Angular6 中必须创建单例服务的方式发生了一些变化。我有一个 Auth 服务,需要为访问它的每个组件构建一次。我将服务提供商设置为 root:

@Injectable({
  providedIn: 'root'
})

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

这是将 providedIn 添加到服务级别的默认行为。根据 Docs

providedIn here tells Angular that the root injector is responsible for creating an instance of the HeroService. Services that are provided this way are automatically made available to the entire application and don't need to be listed in any module.

在您的情况下,只需删除 providedIn: 'root' 并仅在 module.ts 中提供。参考以下.

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

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

在我的例子中,单例服务在使用 JIT(正常的 ng build / ng serve)时不起作用。对我来说,它只在使用 AoT 时有效(ng build --aot / ng serve --aot)。