2016-06-02 20 views
0

まず、ContextクラスとSingletonがあります。 Contextは、HttpとEventsのインスタンスをSingletonに与えることをお勧めします。インジェクタを角度2で使用しているプロバイダがありません

import { Http } from 'angular2/http'; 
import { Injectable, Injector, Provider, provide } from 'angular2/core'; 
import { Events } from 'ionic-angular'; 

@Injectable() 
export class Context{ 
    constructor(private http: Http, private events: Events){} 
} 

export class Singleton{ 
    private static INSTANCE: Singleton; 

    private context: Context; 

    constructor(){ 
     if(Singleton.INSTANCE){ 
      throw new Error(); 
     } 
     let injector = Injector.resolveAndCreate([ 
      Https, 
      Events 
     ]) 
     this.context = injector.get(Context); 
    } 

} 

ただし、私がコンパイルして検査するとき。 「プロバイダなし」のエラーが発生しました。したがって、私はどのようにプロバイダを追加できますか?

第2に、Singletonでhttpとイベントをどのように使用できますか? Singletonthis.httpが動作しないと思います。あなたにもContextを設定する必要が

+0

なぜ、例えば提供プロバイダからのインスタンスを取得することができるようにするためにAngularsインジェクターを注入する必要が

は、「それはコンストラクタでそれらを受け入れることができないので。」ということでしょうか? –

+0

@GünterZöchbauerまあ、それは受け入れることができます。しかし私は手動で「新しい」ものを望んでいません。 –

+0

それから、 'Context'を' Singleton'に注入してください。私の更新された答えを見てください。 'Context'と' Singleton'をどこかに '@App({...、providers:[Singleton、Context]})'を提供する必要があります。 –

答えて

1

let injector = Injector.resolveAndCreate([ 
     Https, 
     Events, 
     Context // <------- 
    ]) 
    this.context = injector.get(Context); 
} 

を言われていること、Angular2は、プロバイダごとに単一のインスタンスを維持します、あなたは暗黙的にInjectorクラスを活用する必要はありません。

SINGLETONクラスは不要です。あなたが別のコンポーネントやサービスに直接Contextインスタンスを注入することができます:コンポーネントのproviders属性でプロバイダを設定することにより

@Component({ 
    (...) 
    providers: [ Context ] 
}) 
export class SomeComponent { 
    constructor(private context:Context) { 
    } 
} 

contextは、コンポーネントのシングルトン、そのサブコンポーネントと、それらが呼び出すすべてのサービスになります。

、あなたのアプリケーションをブートストラップする場合、プロバイダを指定し、アプリケーション全体のシングルトンを定義する場合:

bootstrap(App, [ Context ]); 

は、部品のproviders属性から場合を削除することを忘れないでください。

また、インジェクタがコンポーネントにリンクされていることに注意する必要があります。詳細については、この質問は、あなたがあなたを助ける:

編集

があなたのSingletonクラスにHttpクラスを使用するには、Httpの代わりにHTTP_PROVIDERSを定義する必要があります1:

let injector = Injector.resolveAndCreate([ 
     HTTP_PROVIDERS, // <------- 
     Events, 
     Context 
    ]) 
    this.context = injector.get(Context); 
    this.http = injector.get(Http); // <------- 
} 
+0

さて、私たちは仕事でシングルトンを使用します。だから、実際には、私はシングルトンを使用して注入したいからではありません。私はシングルトンを使用する必要があり、次に注入する必要があります。 –

+0

さらに、 'Singleton'クラスで' http'を使う方法はありますか? Contextで 'http'と' events'をpublicとして宣言すべきですか? –

+0

'Singleton'クラスで' Http'の使用に関する私の答えを更新しました... –

0

更新

export class Singleton{ 
    private static INSTANCE: Singleton; 

    constructor(private context:Context){ 
     console.log(context.http); 
     console.log(context.events); 
    } 
} 

let injector = Injector.resolveAndCreate([ 
     Https, 
     Events 
    ]) 

のみ提供Httpsと `イベントを知っている新しい、独立した注射器を作成します。あなたはbootstrap(...)

constructor(private injector:Injector){ 
    this.context = injector.get(Context); 
} 
関連する問題