You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用@Inject()注入带参数Angular服务时遇NullInjectorError求助

Angular依赖注入报错:No provider for arg1! 解决方法

问题背景

我查阅了多个相关主题的帖子,但仍有疏漏。核心需求是实现一个需要参数的Injectable服务,了解到可通过@Inject装饰器实现,但尝试后出现报错。

代码示例

test-service.service.ts

import { Inject, Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class TestService {
  constructor(@Inject('arg1') public arg1: string) {}
}

test-component.component.ts

import { Component } from '@angular/core';
import { TestService } from './test-service.service';

@Component({
  selector: 'app-test-component',
  standalone: true,
  imports: [],
  template: `<span>{{testService.arg1}}</span>`,
  providers: [
    {
      provide: 'arg1',
      useValue: 'value1',
    },
  ],
})
export class TestComponent {
  constructor(public testService: TestService) {}
}

报错信息

ERROR
Error: R3InjectorError(Environment Injector)[TestService -> arg1 -> arg1]:
NullInjectorError: No provider for arg1!

解决方案

原因分析

TestService通过providedIn: 'root'注册在根注入器,但你在组件的providers中声明的arg1属于组件注入器。Angular的注入器是分层的,根注入器无法访问子层(组件注入器)的依赖,所以找不到arg1的提供者。

方案一:将服务注册到组件注入器

修改组件的providers数组,把TestService也加入其中,让它使用组件注入器的依赖:

import { Component } from '@angular/core';
import { TestService } from './test-service.service';

@Component({
  selector: 'app-test-component',
  standalone: true,
  imports: [],
  template: `<span>{{testService.arg1}}</span>`,
  providers: [
    {
      provide: 'arg1',
      useValue: 'value1',
    },
    TestService // 将服务添加到组件providers
  ],
})
export class TestComponent {
  constructor(public testService: TestService) {}
}

此时可选择移除TestService中的providedIn: 'root',或保留(组件级注册会覆盖根级注册)。

方案二:将参数提供者注册到根注入器

如果需要保持TestService在根注入器的注册,就把arg1的提供者也加到根注入器中:

方式1:在根组件中声明

// 示例:app.component.ts
import { Component } from '@angular/core';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [],
  template: '<app-test-component></app-test-component>',
  providers: [
    { provide: 'arg1', useValue: 'value1' } // 根级注册参数
  ]
})
export class AppComponent {}

方式2:在bootstrap时配置

// main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { AppComponent } from './app/app.component';

bootstrapApplication(AppComponent, {
  providers: [
    { provide: 'arg1', useValue: 'value1' } // 根注入器添加参数提供者
  ]
});

这样根注入器就能找到arg1的依赖,TestService初始化时就能获取到参数。


内容的提问来源于stack exchange,提问作者Morgan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 19:03:20