我正在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
中的undefined
为DefaultRequestOptions
。我也使用Config
类作为其他类中的注入依赖项,所以我确信它正在按预期工作,如果我手动设置this.headers
的值,一切正常。
我做错了会导致配置在DefaultRequestOptions
中未定义?
答案 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]
};