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

Angular NG0201错误求助:无法找到t的提供者

解决Angular自定义指令的NG0201依赖注入错误

这个NG0201错误本质是Angular的依赖注入系统找不到指令构造函数中某个服务的提供者——因为代码被压缩混淆了,所以错误信息里显示的t其实对应你指令里的ConfigurationService或者PermissionService。

问题根源

你的EnvironmentPermissionDirective构造函数注入了两个服务:ConfigurationService和PermissionService,但这两个服务没有在任何模块的providers数组中注册,也没有通过@Injectable()的providedIn配置全局提供。Angular无法找到它们的实例,所以抛出了找不到提供者的错误。

解决方案

你有两种方式来修复这个问题:

方案1:全局注册服务(推荐)

修改ConfigurationService和PermissionService的装饰器,使用providedIn: 'root'让Angular在根注入器中提供它们,这样整个应用都能访问到:

@Injectable({
  providedIn: 'root' // 全局注册服务
})
export class ConfigurationService {
  // 你的服务实现代码
}

@Injectable({
  providedIn: 'root'
})
export class PermissionService {
  // 你的服务实现代码
}

方案2:模块级注册服务

如果这两个服务只在特定模块范围内使用,可以在SharedModule的providers数组中添加它们(因为你的指令在SharedModule中声明,AssetsModule又导入了SharedModule):

@NgModule({
  declarations: [
    // ...其他组件/指令
    EnvironmentPermissionDirective
  ],
  imports: [/* ... */],
  exports: [
    // ...其他导出项
    EnvironmentPermissionDirective
  ],
  providers: [
    DatePipe,
    DecimalPipe,
    // 添加这两个缺失的服务提供者
    ConfigurationService,
    PermissionService,
    // ...其他已有提供者
  ],
})
export class SharedModule { }

额外优化建议

另外,注意你的指令中combineLatest的订阅没有取消,可能会导致内存泄漏。建议添加ngOnDestroy钩子,用takeUntil来管理订阅生命周期:

export class EnvironmentPermissionDirective implements OnDestroy {
  private permission$ = new BehaviorSubject<string>(null);
  private destroy$ = new Subject<void>();

  @Input()
  set appEnvPermission(permission: string) {
    this.permission$.next(permission);
  }

  constructor(
    templateRef: TemplateRef<any>,
    viewContainer: ViewContainerRef,
    configService: ConfigurationService,
    permissionService: PermissionService,
  ) {
    combineLatest([configService.getEnvironment(), this.permission$ ])
      .pipe(takeUntil(this.destroy$)) // 用takeUntil自动取消订阅
      .subscribe({
        next: ([ env, permission ]) => {
          viewContainer.clear();
          if (permissionService.hasEnvPermission(env.name, permission)) {
            viewContainer.createEmbeddedView(templateRef);
          }
        },
        error: err => {
          viewContainer.clear();
        },
      });
  }

  ngOnDestroy() {
    this.destroy$.next();
    this.destroy$.complete();
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:25:44