これは、関係のない2つのコンポーネントが1つのコンポーネントでサービス内でイベントを発行し、もう1つがサービス内でイベントを発行することによって、サービスを介して互いに通信できることがわかっています。コンポーネント内の角型サービスコール関数
私の質問:
はサービスが直接コンポーネントで関数を呼び出すことができますか?
これは、関係のない2つのコンポーネントが1つのコンポーネントでサービス内でイベントを発行し、もう1つがサービス内でイベントを発行することによって、サービスを介して互いに通信できることがわかっています。コンポーネント内の角型サービスコール関数
私の質問:
はサービスが直接コンポーネントで関数を呼び出すことができますか?
デフォルトではありません。サービスはクラスのインスタンスですが、それ以上のことはありません。
@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);
}
}
このようにサービスはObservable
someObservable
は別の値を発するコンポーネントのメソッド「呼び出し」。詳細については
は、あなたがあなたのサービスをブートストラップしていないことを、あなたはapp.moduleであなたのプロバイダの配列にあなたのサービスを追加する以外上記detect change of nested property for component input
答えが正しいか参照してください。あなたは必ずコンポーネントにあなたのサービスでの参照を持っている場合
@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){}
}
の内側にあなたのサービスを注入します。しかし、私はお互いを参照する2つのクラスをお勧めしません。 –
ですから、基本的にイベントをスローしてサブスクライブする方法がベストプラクティスですか? –
Definetely。あなたはオブザーバーでそれを行うことができます。懸念の分離を維持するために、それを分離しておきたいと思っています。ギュンターの答えは正しいようです。 –