【问题标题】:No provider for ObservableDataServiceObservableDataService 没有提供者
【发布时间】:2016-02-19 02:05:50
【问题描述】:

我收到“没有 ObservableDataService 提供者”的错误

ObservableDataService: https://github.com/sanex3339/bannerscreator/blob/master/resources/assets/typescript/Services/ObservableDataService/ObservableDataService.ts

ObservableDataService 将注入的服务: https://github.com/sanex3339/bannerscreator/blob/master/resources/assets/typescript/Services/UploadedTemplatesService/UploadedTemplatesService.ts

我在@ComponentUploadedTemplatesService 的装饰器'providers' 选项中描述了 ObservableDataService。

但是这个错误仍然发生。 为什么我仍然收到此错误?

重要提示!为了防止这个错误,我现在在 repo 中使用全局注入 ObservableDataServicebootstrap(),但 我不需要 ObservableDataService 作为单例。强>

我需要UploadedTemplatesService 作为单例,新的ObservableDataService 将在其中注入。

【问题讨论】:

    标签: angular


    【解决方案1】:

    事实上,当你实现一个服务时,你不需要使用@Component 装饰器来装饰它。使用 @Injectable 装饰器就足够了。

    我想有点令人不安的是,没有办法在 @Injectable 装饰器上设置提供程序。原因是提供者链接到组件。从一个组件执行的所有处理都将使用该组件的注入器。

    我的意思是如果组件A 调用serviceA 调用serviceB。 @Injectable 装饰器将尝试在 componentA 注入器中解析 serviceB。

    另一个重要的部分是 Angular2 的“分层注入器”特性。以下是所有这些元素的概述以及它们与我的示例的关系:

    Application
    (application injector)
         |
    ComponentA  --- ServiceA --- ServiceB
    (component injector)
    

    在这样的应用程序中,我们有两个注入器:

    • 可以使用bootstrap函数的第二个参数配置的应用程序注入器
    • 可以使用该组件的providers 属性配置的AppComponent 注入器。它可以“看到”应用程序注入器中定义的元素。这意味着如果在此提供程序中找不到提供程序,它将自动在此父注入器中查找。如果后者找不到,则会抛出“provider not found”错误。

    因此,在您的情况下,您可以在组件或更高版本的提供程序中定义ObservableDataService。当然在引导程序中定义它是最广泛的......

    这个问题可以为您提供有关分层注入器的更多详细信息 角度工作:

    【讨论】:

    • 为什么我们不需要使用 @Component 装饰器来装饰它。使用 @Injectable 装饰器就足够了。有什么特定的原因吗?
    猜你喜欢
    • 2017-08-13
    • 2021-05-06
    • 2019-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多