为什么向@Injectable服务构造函数注入DatePipe会失败?
你遇到的报错本质是root级别的MyService没有从注入器中匹配到DatePipe的注册项,你说已经添加到providers列表但依然报错,大概率是providers的注册位置不对,可按以下两种方案解决:
方案1:修正DatePipe的注册位置
根据你的项目模式选对应的注册方式:
- 如果你用的是NgModule模式的项目:将
DatePipe添加到MyService所属的NgModule的providers数组中,不要只加在某个业务组件的providers里(组件级providers仅对该组件及其子组件可见,root级服务无法读取)
示例代码:import { NgModule } from '@angular/core'; import { DatePipe } from '@angular/common'; import { MyService } from './my.service'; @NgModule({ providers: [ MyService, DatePipe // 加在此处 ] }) export class AppModule { } - 如果你用的是Angular14+的Standalone独立项目:将
DatePipe添加到bootstrapApplication的全局providers数组中
示例代码(main.ts):import { bootstrapApplication } from '@angular/platform-browser'; import { AppComponent } from './app/app.component'; import { DatePipe } from '@angular/common'; bootstrapApplication(AppComponent, { providers: [ DatePipe // 加在此处 ] })
方案2:直接手动实例化DatePipe(更简单,无需注册provider)
你可以不用依赖注入获取DatePipe,直接在服务内手动实例化,仅需注入当前语言环境即可:
import { DatePipe } from '@angular/common'; import { Inject, Injectable, LOCALE_ID } from '@angular/core'; @Injectable({ providedIn: 'root' }) export class MyService { private datePipe = new DatePipe(this.locale); constructor(@Inject(LOCALE_ID) private locale: string) {} // 后续直接用this.datePipe调用相关方法即可 }
这种方式不需要额外在任何providers数组里添加DatePipe,也不会出现注入报错。
内容的提问来源于stack exchange,提问作者9jaCoder
相关产品推荐
相关产品推荐

