我需要在不使用Angular2的DI(构造函数(私有http:Http))的情况下获取Http的实例。
以下代码来自another stackoverflow question,它适用于Angular2 RC.4及更早版本,但不适用于RC.5 +(HTTP_PROVIDERS不再可用):
const injector = ReflectiveInjector.resolveAndCreate([
HTTP_PROVIDERS
]);
this.http = injector.get(Http);
Stackoverflow上有几个问题,使用相同代码的不同变体,但它们都不适用于RC.5 +。
有人知道如何在RC.5 +中执行相同的操作吗?
答案 0 :(得分:3)
只需查看HttpModule
的来源。您将看到创建Http
所需的所有提供商。大多数提供商都是现已删除的HTTP_PROVIDERS
export function _createDefaultCookieXSRFStrategy() {
return new CookieXSRFStrategy();
}
export function httpFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions): Http {
return new Http(xhrBackend, requestOptions);
}
@NgModule({
providers: [
{provide: Http, useFactory: httpFactory, deps: [XHRBackend, RequestOptions]},
BrowserXhr,
{provide: RequestOptions, useClass: BaseRequestOptions},
{provide: ResponseOptions, useClass: BaseResponseOptions},
XHRBackend,
{provide: XSRFStrategy, useFactory: _createDefaultCookieXSRFStrategy},
],
})
export class HttpModule {
}
只需将上面providers
中的所有内容添加到您传递给ReflectiveInjector.resolveAndCreate
的数组中。
如果您的目标是在引导之前获得Http
,那么您需要处理另一件小事,即CookieXSRFStrategy
。它在引导之前不起作用,因为它依赖于某些平台浏览器的东西。您可以使用noop替换它,如this post
答案 1 :(得分:0)
终于找到了答案。
您可以使用 Injector 来获取依赖关系,如下所示。
<强> service.ts 强>
import { Injectable,Injector } from '@angular/core';
import {Http} from '@angular/http';
@Injectable()
export class Service{
constructor(private injector:Injector){}
display(){
this.http=this.injector.get(Http); //<<<<------here the magic happens
console.log(this.http);
return this.http.get('user.json').map(res => {return res.json()}).toPromise();
}
}
如果您仍有任何疑问,可以查看Angular2.0.0中制作的这款工作插件: https://plnkr.co/edit/eWLB2BaL66pnJ7SC6qAL?p=preview