Angular 2 - 使用" multi"提供者覆盖Http

时间:2016-07-31 02:35:11

标签: angular angular2-http angular2-providers

我想要使用自定义类覆盖Http,说HttpClient在请求之前和回复之后执行某些操作,但是我不想记得导入类而不是平台的http类。

我一直在尝试通过' multi'提供商,但我无法点击它。

这是我的覆盖类:

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
    });
  }
}

这是我的主要内容

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!

有什么想法吗?我是以错误的方式解决这个问题吗?

谢谢!

更新

我发现了blog post。它几乎描述了Gunter在下面描述的内容。我接受了他的回答。

1 个答案:

答案 0 :(得分:2)

仅当提供商被设计为multi: true提供商({1}}时,

multi才有效。 PLATFORM_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, ...},您不会覆盖提供商,而是将另一个项目添加到提供一组值的提供商。