1

我想Http用一个自定义类覆盖,比如说HttpClient在请求之前和响应之后做一些操作,但是我不想记住导入那个类而不是平台 http 类。

我一直在尝试通过“多”供应商来做这件事,但我不能让它点击。

这是我的覆盖类:

import {Injectable} from '@angular/core';
import {Http, Headers} from '@angular/http';

@Injectable()
export class HttpClient {
  private http: Http;

  constructor(http: Http) {
    this.http = http;
  }

  get(url) {
    let headers = new Headers();
    doSomethingToHeader(headers);
    return this.http.get(url, {
      headers: headers
    });
  }
}

这是我的 main.ts

bootstrap(AppComponent, [
  provide(HTTP_PROVIDERS, {useExisting: HTTP_PROVIDERS, multi: true}),
  provide(HTTP_PROVIDERS, {useClass: HttpClient, multi: true})
]);

但是当我尝试在我的应用程序中调用 http.get() 时,我得到了

ORIGINAL EXCEPTION: No provider for Http!

有任何想法吗?我会以错误的方式解决这个问题吗?

谢谢!

更新

我找到了这篇博文。它几乎描述了 Gunter 在下面描述的内容。我接受他的回答。

4

1 回答 1

2

multi: true仅当提供程序被设计为multiPLATFORM_DIRECTIVES. HTTP_PROVIDERS不是multi提供者,它只是个别提供者的集合。

你能做的是

bootstrap(AppComponent, [HTTP_PROVIDERS, {provide: Http, useClass: HttpClient}])

导致循环(见评论)

这应该有效:

bootstrap(AppComponent, [
  HTTP_PROVIDERS, 
  {
    provide: Http, 
    useFactory: (backend, defaultOptions) => new HttpClient(new Http(backend, defaultOptions)),
    deps: [XHRBackend, RequestOptions]
  }
])

重要的部分是覆盖定义的提供者的自定义提供者位于要覆盖的提供HTTP_PROVIDERS之后。因此,重要的HTTP_PROVIDERS是先于{provide: Http, ...}

multi: true您不会覆盖提供程序,而是将另一个项目添加到提供一组值的提供程序。

于 2016-07-31T10:51:12.400 回答