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

Angular 18中NullInjectError:No provider for c_!错误解决求助

解决Angular服务注入错误的方案

问题根源分析

你的AppModule配置存在几个明显错误,这些是导致服务注入失败的核心原因:

  • 组件/模块错误放入providers数组:SalesUnitOverviewComponent、SalesBookingDetailsComponent属于组件,应仅在declarations中声明;HttpClientModule是模块,只能在imports中引入,不能作为服务提供者。另外HttpClient无需手动添加到providers,HttpClientModule会自动提供该服务。
  • 全局错误配置MatDialog依赖:全局提供MAT_DIALOG_DATA和MatDialogRef的空值,会导致所有对话框组件注入这两个依赖时拿到无效值,这完全不符合Angular对话框的设计逻辑。

修正后的AppModule代码

import {
  NgxMatDatetimePickerModule, 
  NgxMatNativeDateModule, 
  NgxMatTimepickerModule 
} from '@angular-material-components/datetime-picker';


@NgModule({
  declarations: [
    AppComponent,
    SalesUnitOverviewComponent,
    SalesBookingDetailsComponent,
    NgbdDatepickerRange,
  ],

  // Angular 9+ 无需手动配置entryComponents,框架会自动处理动态组件
  // entryComponents: [SalesBookingDetailsComponent],
  
  imports: [
    NgxMatDatetimePickerModule,
    MatTabsModule,
    NgxMatTimepickerModule,
    NgxMatNativeDateModule,
    BrowserModule,
    MatDialogModule,    
    MatFormFieldModule,
    MatDatepickerModule,
    MatToolbarModule,
    BrowserAnimationsModule,
    FormsModule,
    MatInputModule,
    MatDividerModule,
    MatSelectModule,
    ReactiveFormsModule,
    HttpClientModule,
    MatProgressSpinnerModule,
    NgbModule,  
    AppRoutingModule,
    MatCheckboxModule,
    MatButtonModule,
    MatTableModule,
    MatSortModule,
    MatPaginatorModule,
    MatCardModule   
  ],
  providers: [
    SalesUnitOverviewService, 
    PaginationService
    // 移除所有错误添加的组件、模块及全局对话框依赖
  ],

  bootstrap: [AppComponent]
})
export class AppModule { }

对话框组件的正确注入方式

如果SalesBookingDetailsComponent作为对话框组件使用,需在组件内部正确注入依赖,并在打开对话框时传递数据:

1. 对话框组件构造函数注入

import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog';
import { Inject } from '@angular/core';

export class SalesBookingDetailsComponent {
  constructor(
    public dialogRef: MatDialogRef<SalesBookingDetailsComponent>,
    @Inject(MAT_DIALOG_DATA) public data: any
  ) { }
}

2. 打开对话框时传递数据

import { MatDialog } from '@angular/material/dialog';

// 在调用对话框的组件中
constructor(private dialog: MatDialog) {}

openBookingDetailsDialog() {
  const dialogRef = this.dialog.open(SalesBookingDetailsComponent, {
    data: { /* 这里传入你的业务数据 */ }
  });
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 01:30:05