Angular 2 - 使用 "multi" 提供商覆盖 Http
Angular 2 - Using "multi" provider to override Http
我想用自定义 class 覆盖 Http
,说 HttpClient
在请求之前和响应之后做一些操作,但是我不想必须请记住导入 class 而不是平台 http class。
我一直在尝试通过 'multi' 提供程序执行此操作,但我无法完全点击它。
这是我的覆盖 class:
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!
有什么想法吗?我是不是用错了方法?
谢谢!
更新
我找到了这个 blog post。它几乎描述了 Gunter 在下面描述的内容。我接受他的回答。
multi: true
仅当提供程序被设计为像 PLATFORM_DIRECTIVES
这样的 multi
提供程序时才有效。 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
,您不会覆盖提供程序,而是将另一个项目添加到提供一组值的提供程序。
我想用自定义 class 覆盖 Http
,说 HttpClient
在请求之前和响应之后做一些操作,但是我不想必须请记住导入 class 而不是平台 http class。
我一直在尝试通过 'multi' 提供程序执行此操作,但我无法完全点击它。
这是我的覆盖 class:
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!
有什么想法吗?我是不是用错了方法?
谢谢!
更新
我找到了这个 blog post。它几乎描述了 Gunter 在下面描述的内容。我接受他的回答。
multi: true
仅当提供程序被设计为像 PLATFORM_DIRECTIVES
这样的 multi
提供程序时才有效。 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
,您不会覆盖提供程序,而是将另一个项目添加到提供一组值的提供程序。