【问题标题】:What is the difference between providedIn: 'Root' than using a service as a provider at the app component?providedIn: 'Root' 与在应用程序组件中使用服务作为提供者有什么区别?
【发布时间】:2021-12-22 14:40:39
【问题描述】:

如果我在应用程序模块(根模块)或装饰器@Injectable 处将服务设置为提供者,使用providedIn: 'root',我假设我将在这两种情况下实现相同的行为。这意味着我的所有应用程序都将“看到”根模块提供的同一个单例类。

但是,如果我没有在服务的 @Injectable 装饰器中设置任何模块并将该类用作应用程序组件模块中的提供者,我将无法在未“创建”的组件中看到相同的服务通过我的模板。例如,我不能在 MatDialog 中使用该服务,该服务是使用 TS 而不是我的模板创建和打开的。

话虽如此,这些方法之间的技术区别是什么?

【问题讨论】:

    标签: angular


    【解决方案1】:

    他们引入了providedIn: 'root',以便更轻松地管理服务。大多数服务都是无状态的单例服务。 providedIn: 'root' 本质上与在 providers 数组中的 app.module 级别添加服务相同。但是,很容易忘记添加此条目和不必要的额外步骤。

    显然,如果您不想要单例服务,而是希望在各个级别提供有状态服务,那么 providers 数组仍然可用。仅仅因为providedIn: root 涵盖了这一点,就在 app.module 级别废弃它会令人困惑。

    【讨论】:

    • 但是为什么如果我在应用程序装饰器中使用提供者数组,与在模块应用程序或服务@Injectable 中使用提供者数组相比,该服务的行为会有所不同?这些声明有何不同?
    • 如果组件提供 DI 对象,这些对象仅在子组件中可见(可注入)。使用 MatDailog 创建不是 AppComponent 子级的新组件实例,因此您的服务在那里不可用。来自docs:“通常,在根模块中提供整个应用程序所需的服务 [...] 当您必须将服务实例限制为组件及其组件树(即其子组件)时,向组件注册提供者。”
    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2020-05-10
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 2018-09-12
    • 2020-09-03
    • 1970-01-01
    相关资源
    最近更新 更多