【问题标题】:Angular 6 Creating Singleton ServiceAngular 6 创建单例服务
【发布时间】:2019-01-15 22:37:44
【问题描述】:

我知道 Angular 6 在创建单例服务的方式上发生了一些变化。我有一个身份验证服务,需要为访问它的每个组件构建一次。我将提供者设置为根服务:

@Injectable({
  providedIn: 'root'
})

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

【问题讨论】:

    标签: angular authentication angularfire2 angular6


    【解决方案1】:

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

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

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

    【讨论】:

    • 我明白了。我不明白然后如何实例化 Auth 服务的全局实例。我收到此错误:未捕获的错误:无法解析 AuthService 的所有参数:(?)。
    • IMPORTS GO HERE @Injectable() export class AuthService { user: any;构造函数(私有 fireBaseAuth:AngularFireAuth){ this.fireBaseAuth.authState.subscribe(user => { if(user){ console.log(user) this.user = user }else{ this.user = undefined } }); } userDetails(){ if(this.user){ return this.user; } else{ return undefined } } isLoggedIn(){ console.log(this.user) if(this.user){ return true } else{ return false } } }
    • 发布您的代码和问题中的 app.module.ts
    • 否,当您刷新页面时,它将再次实例化,是的,您应该进行会话存储
    【解决方案2】:

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

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

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

    【讨论】:

    • Angular 8 中的同样问题。如果没有 aot 标志,它就无法工作。我为这个简单的标志浪费了 2-3 天。为什么没有aot就不行?
    猜你喜欢
    • 2019-01-22
    • 2019-06-21
    • 2016-07-11
    • 2018-10-19
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多