扩展 BaseRequestOptions 时注入的依赖项未定义

Bra*_*don 3 dependency-injection typescript angular

BaseRequestOptions在 Angular2 中进行扩展,为每个请求添加标头。我还有一个Config基于域提供键/值对的类,我需要将其注入到我的派生类中:

import { BaseRequestOptions } from '@angular/http';
import { Config } from '../../config/configuration';

export class DefaultRequestOptions extends BaseRequestOptions {
  constructor(private config: Config) {
    super();

    Object.keys(this.config.api.headers).map((key) => {
      this.headers.append(key, this.config.api.headers[key]);
    });
  }
}
Run Code Online (Sandbox Code Playgroud)

在我的模块中,我这样指定提供者:

@NgModule({
  . . .,
  providers: [
    . . .,
    { provide: RequestOptions, useClass: DefaultRequestOptions }
  ]
})
. . .
Run Code Online (Sandbox Code Playgroud)

我遇到的问题this.configundefinedDefaultRequestOptions. 我还将该类用作Config其他类中的注入依赖项,因此我相信它会按预期工作,并且如果我手动设置所有内容的值,this.headers一切都会正常工作。

我做错了什么会导致配置未定义DefaultRequestOptions

Pau*_*tha 5

提供程序类不需要@Injectable() ,除非它们需要注入构造函数参数。在你的情况下确实如此。这就是为什么 Angular 建议始终在您的提供商上使用它,无论您是否需要注射。也许正是因为这个原因,当你需要的时候,你会忘记它。

@Injectable()
export class DefaultRequestOptions extends BaseRequestOptions {
Run Code Online (Sandbox Code Playgroud)

测试后

看来这还是不行。我已经看到这个问题是扩展已经使用的类@Injectable()(确实BaseRequestOptions如此)的结果。在这种情况下,将调用父构造函数而不是扩展类。如果你扩展RequestOptions(没有用 装饰@Injectable())那么它会起作用

@Injectable()
class DefaultRequestOptions extends RequestOptions {
  constructor(public config: Config) {
    super({method: RequestMethod.Get, headers: new Headers()})

    this.headers.append('data', this.config.data);
  }
}
Run Code Online (Sandbox Code Playgroud)

注意super()来电。BaseRequestOptions这就是所做的一切。

如果您想保持当前的状态,使用BaseRequestOptions,那么您可以使用工厂,而不是让 Angular 创建它

{
  provide: RequestOptions,
  deps: [ Config ],
  useFactory: (config: Config) => {
    return new DefaultRequestOptions(config);
  }
}
Run Code Online (Sandbox Code Playgroud)