Inheritance 从Http继承时,ConnectionBackend没有提供程序

Inheritance 从Http继承时,ConnectionBackend没有提供程序,inheritance,angular,angular2-http,Inheritance,Angular,Angular2 Http,我试图在angular 2中对内置Http服务进行包装,以便能够添加自定义行为(头、参数等) 所以我创建了一个普通类(不是服务)并从Http继承它。 导入{ Http,, 连接后端, 请求选项, 请求选项参数, 标题 }来自“@angular/http”; 从“rxjs/Observable”导入{Observable}; 从“../constants”导入{tamamApiUrl}; 从“./CustomQueryEncoder”导入{CustomQueryEncoder}; 进口“rxjs

我试图在angular 2中对内置Http服务进行包装,以便能够添加自定义行为(头、参数等)

所以我创建了一个普通类(不是服务)并从Http继承它。

导入{
Http,,
连接后端,
请求选项,
请求选项参数,
标题
}来自“@angular/http”;
从“rxjs/Observable”导入{Observable};
从“../constants”导入{tamamApiUrl};
从“./CustomQueryEncoder”导入{CustomQueryEncoder};
进口“rxjs/Rx”;
导出类BaseHttp扩展Http{
受保护的应用程序数据服务;
受保护的baseUrl:string=tamamApiUrl;
受保护的编码器:CustomQueryEncoder;
构造函数(后端:ConnectionBackend,
defaultOptions:RequestOptions,applicationDataService:any){
超级(后端,默认选项);
this.applicationDataService=applicationDataService;
}
获取(url:string,options?:RequestOptionsArgs):可观察

尝试在组件中注入创建的服务后,我收到一个错误:

错误\u handler.js:47异常:未捕获(承诺中):错误:./VehiclesListComponent类VehiclesListComponent\u主机中的错误-内联模板:0:0由以下原因引起:ConnectionBackend没有提供程序!

我试图使用堆栈溢出来搜索解决方案,但它发现,HtpModule应该已经具备了正常工作所需的所有功能


有人能帮我吗?问题出在哪里?

您不能像这样将其添加到提供商中

providers: [ ApplicationService, InspectionHttpService ]
如果您这样做,Angular将尝试创建它,并且它将找不到
ConnectionBackend

imports: [HttpModule],
providers: [
  ApplicationService,
  {
    provide: InspectionHttpService,
    deps: [XHRBackend, RequestOptions, ApplicationService],
    useFactory: (backend, options, aplicationService) => {
      return new InspectionHttpService(backend, options, applicationService);
    }
  }
]
您需要使用一个工厂,在那里您只需传递
XHRBackend
(它实现了
ConnectionBackend

有了它,您可以将其作为
InspectionHttpService
注入

constructor(private http: InspectionHttpService) {}
如果希望能够将其作为
Http
注入,则需要将
provide
更改为
Http
,而不是
InspectionHttpService
。但是如果需要,这会覆盖任何使用常规
Http
的功能

更新 在某些环境中,上面的代码可能会出错。我忘记了确切的错误消息,但它将为您提供提取工厂函数的建议解决方案,即

export function httpFactory(backend: XHRBackend, options: RequestOptions,
                            service: ApplicationService) {
  return new InspectionHttpService(backend, options, service);
}

useFactory: httpFactory

根据我的记忆,我认为错误与AoT有关。在扩展Http服务时,必须为父类注入后端和选项:

@Injectable()
导出类HttpInterceptor扩展Http{
建造师(
后端:XHRBackend,
选项:请求选项,
...
) {
超级(后端,选项);
}
...

}
我还将此链接用作从Http继承的示例:请将代码作为文本添加到问题中,而不是链接到屏幕截图。它的格式非常奇怪,但我会尝试。只需选择代码并按编辑器工具栏中的
{}
按钮即可(或者使用任何其他方法使每个代码行以至少4个空格开头)要好得多,但这是一个错误的按钮。代码片段
[]
仅适用于可在问题内部实际执行的代码,
[{}]
用于无法运行的代码。伙计,你太棒了!你节省了我的时间。但我怎么知道呢?我想我们仍然需要更好的文档,或者在学习angular2的DI时我丢失了一些东西。非常感谢你这么快的回复!祝你愉快,希望你做得很好)我收到一个错误-“没有XHRBackend的提供者”-想法?@Kudoz您仍然需要导入其导入的
HttpModlule
。我认为问题与导入扩展HTTP类时有关。我在bootstrap中提供了它-如果我将其作为ngModule的一部分提供,似乎可以工作。