扩展BaseRequestOptions时

时间:2016-10-27 21:01:02

标签: angular typescript dependency-injection

我正在Angular2中扩展BaseRequestOptions以为每个请求添加标头。我还有一个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]);
    });
  }
}

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

@NgModule({
  . . .,
  providers: [
    . . .,
    { provide: RequestOptions, useClass: DefaultRequestOptions }
  ]
})
. . .

我遇到的问题是this.config中的undefinedDefaultRequestOptions。我也使用Config类作为其他类中的注入依赖项,所以我确信它正在按预期工作,如果我手动设置this.headers的值,一切正常。

我做错了会导致配置在DefaultRequestOptions中未定义?

2 个答案:

答案 0 :(得分:4)

提供者类不需要@Injectable() ,除非他们需要注入构造函数参数。在你的情况下它确实如此。这就是为什么Angular建议总是在您的提供商上使用它,无论您是否需要注射。也许出于这个确切的原因,你忘了哪里,何时需要。

@Injectable()
export class DefaultRequestOptions extends BaseRequestOptions {

测试后

这似乎仍然无法奏效。我已经看到此问题是扩展已使用@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);
  }
}

注意super()电话。这就是BaseRequestOptions does

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

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

答案 1 :(得分:1)

这实际上比peeskillet的答案容易得多。定义提供程序时,还要指定该提供程序的依赖项,如下所示:

providers: [
{
    provide: RequestOptions,
    useClass: DefaultRequestOptions,
    deps: [Config]
};