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: truemultiプロバイダーが のようなプロバイダーになるように設計されている場合にのみ機能しますPLATFORM_DIRECTIVESHTTP_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 に答える