"无法解决所有参数......"与@Optional装饰

时间:2017-09-10 06:59:28

标签: angular dependency-injection swagger-codegen

我得到一个奇怪的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的答案可能是大多数人可能正在寻找的答案。但是,我正在寻找一种解决方案,它不会因为自动生成而改变原始实现。

3 个答案:

答案 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

的优势

然后,您需要在NgModuleproviders数组中添加一个提供对象:

@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)注释掉可选服务部分,重新​​运行它并寻找一个   不同的错误消息。