【问题标题】:Inject additional parameters to Angular 10 service向 Angular 10 服务注入额外的参数
【发布时间】:2021-04-23 08:03:07
【问题描述】:

我正在尝试向我的服务注入其他参数。我正在关注本教程https://www.techiediaries.com/pass-parameters-angular-10-service-inject/

但是当我运行我的程序时,我得到 NullInjectorError: No provider for param!

这是否可行,因为这看起来很简单,我无法理解我可能会做错什么。

为什么我需要这样做是因为有一项服务需要知道对象 ID 才能正常工作。如何获取此 id 取决于此服务的注入位置。

但为了让事情顺利进行,我想先让这个硬编码的值起作用。

PS。如果我删除该私有参数:服务构造函数中的字符串将正确注入。

【问题讨论】:

    标签: angular


    【解决方案1】:

    您需要从app.module.ts providers 数组中的某处提供您的参数:

    例如,从环境文件中获取的 apiUrl 字段:

    providers: [
        {
          provide: 'apiUrl',
          useValue: environment.apiUrl
        },
      ],
    

    其中apiUrlenvironment.ts 文件中声明。

    然后,通过构造函数注入你的服务:

    constructor(
        private http: HttpClient,
        @Inject('apiUrl') private baseUrl: string
      ) {
      }
    

    更新:passing service parameter from component

    "你可以把提供者放在组件中,如果服务本身 组件中也提供了。这些值需要在 与服务级别相同或更高。”

    【讨论】:

    • 好的,谢谢。根据该教程,可以从组件中提供它,但我想那是不正确的?我现在可以通过将服务的 Injectable providedIn 从“root”更改为“any”,从我的子模块中提供额外的参数。如果我将其保留为“根”,那么我确实可以提供来自 app.module.ts 的值,但它不再用于此目的,因为我需要根据我的服务注入的模块提供不同的值。
    • 说实话,我从未尝试从组件中提供值。尝试在服务构造函数中使用 @Optional() 运算符。或许stackoverflow.com/questions/42396804/…对你有帮助
    • 谢谢,这个链接确实有帮助。答案在 cmets 内。我会将它粘贴在这里以供将来可能的访问者使用:“如果组件中也提供了服务本身,则可以将提供程序放在组件中。需要在与服务相同或更高级别提供值。”
    • 我会将您的初始回复标记为答案。我不知道这是否真的对我想要实现的目标有所帮助,但我认为我的问题得到了回答。底线是我认为我遵循的教程不正确或不完整。
    • 谢谢。我用解决方案更新了我的答案并将其链接到该主题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-19
    • 1970-01-01
    • 2020-11-21
    • 2018-10-21
    • 1970-01-01
    • 2017-08-24
    • 2019-06-22
    相关资源
    最近更新 更多