2016-03-30 6 views
2

これは、関係のない2つのコンポーネントが1つのコンポーネントでサービス内でイベントを発行し、もう1つがサービス内でイベントを発行することによって、サービスを介して互いに通信できることがわかっています。コンポーネント内の角型サービスコール関数

私の質問:

サービスが直接コンポーネントで関数を呼び出すことができますか?

+0

の内側にあなたのサービスを注入します。しかし、私はお互いを参照する2つのクラスをお勧めしません。 –

+1

ですから、基本的にイベントをスローしてサブスクライブする方法がベストプラクティスですか? –

+0

Definetely。あなたはオブザーバーでそれを行うことができます。懸念の分離を維持するために、それを分離しておきたいと思っています。ギュンターの答えは正しいようです。 –

答えて

9

デフォルトではありません。サービスはクラスのインスタンスですが、それ以上のことはありません。

@Injectable() 
class MyService { 
} 

@Component({ 
    selector: 'my-component', 
    ... 
)} 
class MyComponent { 
    constructor(private myService:MyService) {} 
} 

@NgModule({ 
    providers: [MyService], 
    ... 
}) 
export class AppModule {} 

この方法でサービス(MyService)インスタンスがMyComponentに渡されますが、それがすべてです。サービスインスタンスには、MyComponentについての知識はありません。

サービスにObservableを追加し、コンポーネントに登録することをお勧めします。

@Component({ 
    selector: 'my-component', 
    ... 
)} 
class MyComponent { 
    constructor(myService:MyService) { 
    myService.someObservable.subscribe(value => doSomething(value)); 
    } 

    doSomething(value) { 
    console.debug(value); 
    } 
} 

このようにサービスはObservablesomeObservableは別の値を発するコンポーネントのメソッド「呼び出し」。詳細については

は、あなたがあなたのサービスをブートストラップしていないことを、あなたはapp.moduleであなたのプロバイダの配列にあなたのサービスを追加する以外上記detect change of nested property for component input

+0

注入されたMyService inコンポーネントを確認し、別の場所のMyServiceが同じオブジェクトを参照していることを確認する必要があります。それ以外の場合、コンポーネントはMyServiceのイベントに応答できません。 – Chao

+0

これは、コンポーネントではなく、共通の親(または、アプリケーション全体の共通の親である '' AppComponent'または 'bootstrap()')にdirectolyを提供することで実現します。 –

+0

あなたは正しいです。私は他人に気づくだけです。素晴らしいソリューションが得られます。 – Chao

0

答えが正しいか参照してください。あなたは必ずコンポーネントにあなたのサービスでの参照を持っている場合

@NgModule({ 
    declarations: [MyComponent], 
    imports: [], 
    providers: [MyService], 
    bootstrap: [AppComponent] 
}) 

その後、コンポーネント

import { Component } from '@angular/core' 

import { MyService } from './path/to/my.service' 

... 

export class MyComponent { 

    constructor(private myService:MyService){} 

} 
関連する問題