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.config是undefined在DefaultRequestOptions. 我还将该类用作Config其他类中的注入依赖项,因此我相信它会按预期工作,并且如果我手动设置所有内容的值,this.headers一切都会正常工作。
我做错了什么会导致配置未定义DefaultRequestOptions?
提供程序类不需要@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)
| 归档时间: |
|
| 查看次数: |
1589 次 |
| 最近记录: |