我正在尝试在Angular中使用“ providedin”功能,但收到错误“ StaticInjectorError(AppModule)[DashboardComponent-> DashboardService]:”
@Injectable({
providedIn: DashboardModule
})
export class DashboardService {
getContent() {
return 'Dashboard Service works!!!';
}
}
完整演示https://stackblitz.com/edit/angular-kbkjet 谢谢您的努力!
答案 0 :(得分:7)
有关“附加模块”的更多信息,请参见:https://www.youtube.com/watch?v=jigR_jBhDMs&feature=youtu.be
此处的示例代码:https://github.com/web-dave/provide-in-test
此处讨论循环依赖问题:https://github.com/web-dave/provide-in-test/issues/1
答案 1 :(得分:1)
Stepan Suvorov发布的stackblitz example在使用时不起作用
providedIn: AppModule
由于存在依赖性问题,导致AppModule
无法解决(未定义)。
如果在console.log(AppModule)
装饰器上方添加@Injectable
,则输出为undefined
。
注意 您实际上看不到stackblitz上的依赖性问题,但是如果您在本地角度cli上复制项目,则可以看到以下警告。
警告:在循环依赖项中检测到: src \ app \ app.component.ts-> src \ app \ my.service.ts-> src \ app \ app.module.ts-> src \ app \ app.component.ts
在循环依赖项中检测到警告: src \ app \ app.module.ts-> src \ app \ app.component.ts-> src \ app \ my.service.ts-> src \ app \ app.module.ts
警告:在循环依赖项中检测到: src \ app \ my.service.ts-> src \ app \ app.module.ts-> src \ app \ app.component.ts-> src \ app \ my.service.ts
我认为在AppModule
中使用providedIn
没有任何意义,您最好也使用root
。但是,如果您只希望在子模块中提供服务,则该功能应类似于stackblitz demo
注意:在声明可注射服务时,如果您将providedIn
与模块值一起使用,则指定的模块不能是声明使用该服务的组件的模块(非常详尽) )
答案 2 :(得分:1)
确保像下面这样在测试中导入了模块:
beforeEach(() => TestBed.configureTestingModule({
imports: [DashboardModule]
}));
答案 3 :(得分:-3)
最后,我找到了解决方法:https://angular.io/guide/providers#providedin-and-ngmodules 服务也应在模块的提供者部分中提及。
@NgModule({
imports: [CommonModule],
declarations: [DashboardComponent],
exports: [DashboardComponent],
providers: [DashboardService]
})
Demo已更正。 谢谢你们!