2016-09-21 5 views
4

次のコードは、another stackoverflow questionから取られ、そしてそれはAngular2 RC.4で動作したコンストラクタDIを使用せずにHttpインスタンスを作成するには? (RC.5 +)私はAngular2のDI(コンストラクタ(民間のhttp:HTTP)を)使用せずのHttpのインスタンスを取得する必要があり

となく、RC.5 +での以前のバージョン(HTTP_PROVIDERSが利用できなくなりました):

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

this.http = injector.get(Http); 

あり、同じコードの異なる亜種とStackOverflowの上ここではいくつかの質問がありますが、それらのどれもRC.5 +で動作しません。

RC.5 +で同じことを行う方法を知っている人はいますか?

+0

DIでRC5でhttpを使用する方法を教えてください。どうすればいいですか?それは大丈夫でしょうか? – micronyks

+0

私はすでにDIでHttpを使用する方法を知っています。 –

+0

しかし、HTTP_PROVIDERSが削除されたので、この方法はもう使えません。 – micronyks

答えて

3

ただ、ソースを見てHttpModuleの場合Httpの作成に必要なすべてのプロバイダが表示されます。これらのプロバイダのほとんどは何であったで、今ちょうどあなたがReflectiveInjector.resolveAndCreateに渡す配列に上記providersのすべてを追加し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 { 
} 

を削除しました。

ブートストラップの前にHttpを取得することを目指す場合は、もう少し注意が必要なものがあります。これはCookieXSRFStrategyです。ブートストラップの前には動作しません。これは、プラットフォームのブラウザの一部に依存するためです。 this post

+0

これは機能しているようです(私は完全にテストすることができません。アプリ内の他のものもリファクタリングする必要があるからです。ブラウザでアプリがクラッシュすることはなくなりました)。私は少しだけ心配しています.GETコールは(これはBaseRequestOptionsのデフォルトのメソッドなので)呼び出すことができますが、後でそれを扱います。 私はそれをテストするとすぐに、私はあなたの答えを有効なものとしてマークします。 また、ソースコードをより頻繁に見ていきます。この回答をどのように思いついたか教えてくれてありがとう。 –

+0

私はそれを信じることができません。できます!この回答をありがとうございます。 –

0

最後に回答が見つかりました。

インジェクタを使用すると、以下のように依存関係を取得できます。

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で作られたこの作業plunker確認することができます:
https://plnkr.co/edit/eWLB2BaL66pnJ7SC6qAL?p=preview

+2

注射可能なものがあれば、コンストラクタでhttpを直接使用するでしょう... – SparK

関連する問題