【发布时间】:2017-03-23 07:18:45
【问题描述】:
我正在尝试围绕 Angular 2 中的内置 Http 服务进行包装,以便有可能添加自定义行为(标头、参数等)
所以我创建了一个普通的类(不是服务)并从 Http 继承它。 Class definition
import {
Http,
ConnectionBackend,
RequestOptions,
RequestOptionsArgs,
Headers
} from '@angular/http';
import { Observable } from 'rxjs/Observable';
import {tamamApiUrl} from '../constants';
import {CustomQueryEncoder} from './CustomQueryEncoder';
import 'rxjs/Rx';
export class BaseHttp extends Http {
protected applicationDataService;
protected baseUrl: string = tamamApiUrl;
protected encoder: CustomQueryEncoder;
constructor(backend:ConnectionBackend,
defaultOptions: RequestOptions, applicationDataService: any) {
super(backend, defaultOptions);
this.applicationDataService = applicationDataService;
}
get(url: string, options?: RequestOptionsArgs): Observable<any> {
this.addDefaultOptions(options);
return super.get(url, options);
}
post(url: string, body: any, options?: RequestOptionsArgs): Observable<any> {
this.addDefaultOptions(options);
this.addDefaultPostOptions(options);
return super.post(url, body, options);
}
private addDefaultOptions(options?: RequestOptionsArgs): RequestOptionsArgs {
if (options == null) {
options = new RequestOptions();
}
if (options.headers == null) {
options.headers = new Headers();
}
const applicationData = this.applicationDataService.getApplicationData();
if (applicationData.applicationKey) {
options.headers.append('application-id', applicationData.applicationKey);
}
if (applicationData.secretKey) {
options.headers.append('secret-key', applicationData.secretKey);
}
if (applicationData.userToken) {
options.headers.append('user-token', applicationData.userToken);
}
return options;
}
private addDefaultPostOptions(options): void {
options.headers.append('Content-Type', 'application/json');
}
/*private requestInterceptor(): void {
this.loaderService.showPreloader();
}
private responseInterceptor(): void {
this.loaderService.hidePreloader();
}*/
}
我创建了一个从此类继承的服务,以便以后可以将其注入并用于我的目的。
import { Headers, URLSearchParams } from '@angular/http';
import {tamamRootUrl} from '../constants';
import {BaseHttp} from '../api/BaseHttp';
import { Injectable } from '@angular/core';
import {
ConnectionBackend,
RequestOptions,
} from '@angular/http';
import {ApplicationService} from './ApplicationService';
@Injectable()
export class InspectionHttpService extends BaseHttp{
protected baseUrl: string = tamamRootUrl;
protected params: URLSearchParams = new URLSearchParams();
constructor(backend: ConnectionBackend,
defaultOptions: RequestOptions, protected applicationService: ApplicationService) {
super(backend, defaultOptions, applicationService);
}
getRootUrl() {
return this.baseUrl;
}
}
在我尝试在组件中注入创建的服务后,我收到一个错误:
error_handler.js:47 例外:未捕获(承诺中):错误:./VehiclesListComponent 类 VehiclesListComponent_Host 中的错误 - 内联模板:0:0 原因:没有 ConnectionBackend 提供程序!
我尝试使用堆栈溢出搜索解决方案,但它看到 HtpModule 应该已经具备正常工作所需的一切。
谁能帮帮我?问题出在哪里?
【问题讨论】:
-
我也用这个链接作为继承自Http的例子:blog.tomasandtomas.com/…
-
请将代码作为文本添加到问题中,而不是链接到屏幕截图。
-
它的格式很奇怪,但我会尝试。
-
只需选择代码并按下编辑器工具栏中的
{}按钮(或使用任何其他方式使每个代码行以至少4个空格开头) -
好多了,但它是错误的按钮。片段
[<>]仅适用于可以在问题中实际执行的代码,[{}]适用于不可运行的代码。
标签: inheritance angular angular2-http