2016-05-11 17 views
28

私は別のサービスへのサービスを注入したい:角2:別のサービスにサービスを注入する。 (NOプロバイダエラーなし)

@Injectable() 

export class Dispatcher { 
} 


@Injectable() 

export class TodoStore { 

    constructor(@Inject(Dispatcher) dispatcher:Dispatcher){ 

    } 
} 

しかし、私は常にエラーを取得:ディスパッチャなしのプロバイダ!

ありがとうございました。

+2

'@Inject(Dispatcher)'は、パラメータタイプが同じ場合は冗長です。 –

+1

私の設定では、コンポーネントのようにサービスをインポートして、そのまま使用することができます。基本的には、インポートが不足しているだけです。 – Huangism

答えて

32

サービスはどこかprovideにする必要があります。

bootstrap(AppComponent,[TodoStore,Dispatcher]); 

またはアプリのコンポーネント:

@Component({ 
    ... 
     providers:[TodoStore,Dispatcher] 
} 
... 

またはその他のコンポーネントで、ニーズに応じて、あなたは、ブートストラップ法でそれを提供することができangular2 docs

を参照してください。

また、コンストラクタには@Inject(Dispatcher)は必要ありません。これは、基本的にはそうそう、返信用にSO :)

+1

コンストラクタに '@Inject(Dispactcher)'が必要になりました。 –

+0

メソッドが非同期と呼ばれるとどうなりますか? @Inject( 'Service')サービス –

+0

@AlejandroLora私はあなたのポイントを正しく理解しているかどうかはわかりませんが、コンストラクタに注入されたものにアクセスすることはできません。しかし、私はあなたが「これ」を間違って使っていると思います。私の推測が正しいとすれば、あなたの問題は注射に関連していません。 [この投稿](http://stackoverflow.com/questions/20279484/how-to-access-the-correct-this-context-inside-a-callback)を参照してください。私の推測が正しくない場合は、問題の例をプランナーに提示してください。 – Abdulrahman

5

感謝を歓迎

constructor(dispacher:Dispatcher){ 
} 

と同じです。

コンポーネントではないため、@Component(...)ソリューションは適用されません。

bootstrap(AppComponent,[TodoStore,Dispatcher]); 

ソリューションが動作します。しかし、それはこれを中心にしていますmain.ts

+2

なぜ '@Component()'がうまくいかないと思いますか? '@Component()'はプロバイダを登録する場所ですが、それでもサービスへのインジェクションは可能です。 –

+1

@GünterZöchbauerでもサービスは@コンポーネントデコレータを持っていないので、別のサービスの中でサービスを調べたい場合は、そのコンポーネントをbootstrap()に含める必要があります。なぜなら、@コンポーネントとそのすべての子;単純なサービスの親ではありません。@ Componentデコレータなしで、単純なクラスです。例:mock.service.ts: '@ angular/core'のimport {Injectable}; {HEROES}を './mock-heroes'からインポートします。 @Injectable() エクスポートクラスMockService { getHeroes(){return HEROES; } } – stackdave

+0

です。 '@Component()'は質問には言及されていませんでした。なぜこれが答えの中で何に言及されたのか不思議でした。 –

-6

これを試してみてください:

myMainService.ts

import { myOtherService } from 'myOtherService'; 

export class myMainService { 
constructor() { 
    let myOtherService = new myOtherService(); 
} 
} 

myOtherService.ts

export class myOtherService { 
    constructor() { 
     console.log('service was imported'); 
    } 
} 
+0

依存関係は注入されていないがハードワイヤードであるため、コンストラクタがあなたの "メインサービス"に "他のサービス"を注入するカスタムサービスプロバイダを書くことを検討してください。 – cmonsqpr

-1

プロバイダの配列が@NgModuleで利用可能です。その配列でサービスを宣言することで、サービスを提供することができます。

@NgModule({ 
    declarations:[...], 
    imports:[...], 
    providers: [MyCustomService], 
    bootstrap:[AppComponent] 
}) 
関連する問題