2016-04-30 4 views
1

私はangular2/Typescriptを使用してアプリケーションを構築しており、依存関係として注入されたサービスにアクセスしようとしています。 Angular 1.xでは、コントローラー関数を介してこのサービスにアクセスし、すべての子関数は同じ依存関係にアクセスできました。ここでは、コンポーネントのコンストラクタに次のように注入しています。クリック機能でのangular2アクセス依存性

constructor(@Inject(JRummy) rummyGame: JRummy) { 

     this.currentGame = new Game(); 
     rummyGame.startGame(this.currentGame); 

    } 

ここでrummyGameは注入しようとしているサービスです。これは正しく動作しています。しかし、コンストラクタ内でこのサービスにアクセスした後、他の関数でどのようにアクセスするのですか?例えば、私はrummyGameサービスのメソッドを呼び出したいコンポーネント内の次のクリック機能を持っている:それはちょうどに注入した場合rummyGameサービスは、このクリック機能に注入取得んか

simulateComputer():void { 

     rummyGame.computerPlaySolo(); 

    } 

コンストラクタ?コンストラクタによってアクセスされた後にそのサービスのインスタンスを格納するためにコンポーネントにプロパティを作成する必要がありますか?

答えて

3

変数をprivateと短くすると、クラスのコンテキスト(this)で直接利用できるようになります。

constructor(@Inject(JRummy) private rummyGame: JRummy) { 

    //code here 

} 
//do access service object by having this.rummyGame 
simulateComputer():void { 
    this.rummyGame.computerPlaySolo(); 
} 

他の事は、あなたがそれの依存関係などの他のコンポーネントのコンストラクタの内部injectable作るために、あなたのサービスクラスを超える@Injectableデコレータを持っている必要があります。

+0

私はこれを試しました - rummyGame.computerPlaySolo()の呼び出し; (@Inject(JRummy)private rummyGame:JRummy)のコンストラクタで正しく動作しますが、simulateComputer関数で同じメソッド呼び出しを追加するとエラーが発生します:ORIGINAL EXCEPTION:TypeError:l_context.computerPlaySolo is not a機能 angular2.dev.js:22367 ORIGINAL STACKTRACE: angular2.dev.js:22367例外TypeError:l_context.computerPlaySoloはあなたの答えはすでに欠けている部分を覆っていたAbstractChangeDetector.ChangeDetector_AppComponent_comp_0.handleEventInternal' –

+0

での関数 ではありません。ニース.. –

1

解決済み - Pankajからの応答は正しいですが、サービス自体のrummyGame.computerPlaySolo()メソッドに@Injectable()デコレータを追加しませんでした。メソッドがコンストラクタから@Inject宣言を使用してコンストラクタシグネチャで直接呼び出されたとき、@Injectable()デコレータなしで機能しましたが、click関数でアクセスしようとすると関数にアクセスできませんでした@注入可能な宣言なしで

関連する問題