【问题标题】:Injected dependency is undefined when extending BaseRequestOptions扩展 BaseRequestOptions 时未定义注入的依赖项
【发布时间】:2017-03-10 16:47:15
【问题描述】:

我在 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.configDefaultRequestOptions 中是undefined。我还在其他类中使用Config 类作为注入依赖项,因此我确信它按预期工作,如果我手动设置this.headers 的值,一切正常。

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

【问题讨论】:

标签: angular typescript dependency-injection


【解决方案1】:

这实际上比 peeskillet 的答案要容易得多。在定义您的提供者时,还要指定该提供者的依赖项,使其看起来像:

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

【讨论】:

    【解决方案2】:

    提供者类不需要@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);
      }
    }
    

    【讨论】:

    • 谢谢。我一进去就先试试看。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-25
    • 2018-12-18
    • 2014-06-05
    • 2012-09-22
    相关资源
    最近更新 更多