How to create an Http instance WITHOUT using constructor DI? (RC.5+) [duplicate]

强颜欢笑 提交于 2019-12-20 01:34:31

问题


I need to get an instance of Http without using Angular2's DI ( constructor(private http: Http) )

The following code was taken from another stackoverflow question, and it works in Angular2 RC.4 and earlier versions, but not in RC.5+(HTTP_PROVIDERS is no longer available) :

const injector = ReflectiveInjector.resolveAndCreate([
  HTTP_PROVIDERS
]);

this.http = injector.get(Http);

There are several questions here on Stackoverflow with different variants of that same code, but none of them works in RC.5+.

Does anybody know of how to perform that same thing in RC.5+?


回答1:


Just look at the source for HttpModule. You'll see all the providers required to create the Http. Most of those providers were what were in the now removed 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 {
}

Just add everything in the above providers to the array you pass to ReflectiveInjector.resolveAndCreate.

If your goal is to get the Http before bootstrap, there's another little thing you need to take care of, which is the CookieXSRFStrategy. It will not work prior to bootstrapping, as it is dependendent on some platform browser stuff. You can just replace it with a noop, as mentioned in this post




回答2:


Finally found an answer.

You can use Injector to get dependency as shown below.

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


If you still have any doubt, you can check this working plunker made in Angular2.0.0 :
https://plnkr.co/edit/eWLB2BaL66pnJ7SC6qAL?p=preview



来源:https://stackoverflow.com/questions/39622965/how-to-create-an-http-instance-without-using-constructor-di-rc-5

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!