2016-07-31 51 views
1

我想覆盖Http自定义类,说HttpClient做一些操作之前请求和响应后,但我不想记得导入该类而不是平台http类。Angular 2 - 使用“多”提供程序来覆盖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! 

有没有想法?我是否以这种错误的方式去做?

谢谢!

UPDATE

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

回答

2

multi: true只适用于当供应商被设计为multi供应商如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您不重写提供程序,而是将另一项添加到提供一组值的提供程序。

+0

我试过了,但我得到了循环依赖。在你声明这样的提供者之后,是否有一种特殊的方式需要导入它以在服务/组件中使用this.http.get()? –

+0

请提供更多详情。什么是确切的错误信息? –

+0

原始异常:无法实例化循环依赖! (Http - > Http) –