我得到一个奇怪的DI错误。这是来自swagger-codegen的一段自动生成的代码 - 我无法改变它。我试图注入这项服务。但是,当我运行ng build --aot
时,我收到Can't resolve all parameters...
DI错误。
我试图完全删除脚趾@Optional参数,它似乎工作。所以这似乎是罪魁祸首。
我的问题:如果参数不可选,为什么我会收到错误?如果我想实际注入这个参数,我也会感兴趣,因为它是一个原始类型。
@Injectable()
export class MyApi {
protected basePath = 'https://localhost/';
public defaultHeaders : Headers = new Headers();
constructor(protected http: Http, @Optional() basePath: string) {
if (basePath) {
this.basePath = basePath;
}
}
}
注意:@ Nildari和@PierreDuc的答案可能是大多数人可能正在寻找的答案。但是,我正在寻找一种解决方案,它不会因为自动生成而改变原始实现。
答案 0 :(得分:2)
您需要使用InjectionToken
:
export const BASE_PATH: InjectionToken<string> = new InjectionToken<string>('basePath');
// note that the string value `basePath` is just a description of the `InjectionToken`
// and not actually the base path.
使用InjectionToken
然后,您需要在NgModule
的providers
数组中添加一个提供对象:
@NgModule({
//...
providers: [
{provide: BASE_PATH, useValue: '/'}
]
})
然后,您可以使用@Inject
constructor(protected http: Http, @Inject(BASE_PATH)basePath: string) {
if (basePath) {
this.basePath = basePath;
}
}
如果您愿意,可以添加@Optional
装饰器..但是如果您将它添加到您的提供者数组中,它将永远被找到
答案 1 :(得分:2)
如果您想将basePath
注入MyApi
服务类,可以像下面这样执行
向应用提供商添加一些“路径”提供商,并使用@Inject('path')
参数装饰器将其注入MyApi
类
@Injectable()
export class MyApi {
protected basePath = 'https://localhost/';
public defaultHeaders : Headers = new Headers();
constructor(protected http: Http, @Inject('path') basePath: string) {
if (basePath) {
this.basePath = basePath;
}
}
}
比应用程序的bootstrap文件(@NgModule)
bootstrap('name of your app.component class', [
MyApi,
provide('path', { useValue: 'any value which you want to inject'})
]);
您可以使用@Optional
参数使依赖项可选。
答案 2 :(得分:0)
存在一个“错误分类”,在这里错误地报告了“无法解决的”依赖项的位置:
我有一个BusyTaskService
,我在几个地方使用它来表示正在加载某些东西。
我遇到此错误:
main.js:54282 NullInjectorError: StaticInjectorError(AppModule)[SupportQuestionComponent -> BusyTaskService]:
StaticInjectorError(Platform: core)[SupportQuestionComponent -> BusyTaskService]:
NullInjectorError: No provider for BusyTaskService!
实际上BusyTaskService
没有依赖关系,并且组件本身已经在提供服务,这根本没有道理!
...
providers: [ BusyTaskService ]
})
export class QuickSupportQuestionComponent implements OnInit {
constructor(@Optional() private busyTaskService: BusyTaskService,
那怎么可能?
我在代码中的其他任何地方都找到了另一个服务,该服务使用BusyTaskService
而不使用@Optional()
,并且该服务在提供它的DI树中没有父项。将服务设为可选服务后,一切正常。
因此,如果您收到此消息,则毫无意义:
1)随处搜索您对服务的使用情况,并确保它 有供应商
2)注释掉可选服务部分,重新运行它并寻找一个 不同的错误消息。