サービスとコンポーネントとの間の相互作用があり得る場合の例:
サービス:
@Injectable()
export class MyService {
myMethod$: Observable<any>;
private myMethodSubject = new Subject<any>();
constructor() {
this.myMethod$ = this.myMethodSubject.asObservable();
}
myMethod(data) {
console.log(data); // I have data! Let's return it so subscribers can use it!
// we can do stuff with data if we want
this.myMethodSubject.next(data);
}
}
コンポーネント1(送信者):
export class SomeComponent {
public data: Array<any> = MyData;
public constructor(private myService: MyService) {
this.myService.myMethod(this.data);
}
}
COMPONENT2(受信機)
export class SomeComponent2 {
public data: Array<any> = MyData;
public constructor(private myService: MyService) {
this.myService.myMethod$.subscribe((data) => {
this.data = data; // And he have data here too!
}
);
}
}
説明:
MyService
はdata
を管理しています。必要ならばdata
でまだやりとりをすることができますが、それはComponent2
に任せておく方が良いです。基本的
MyService
がComponent1
からdata
を受け取り、方法myMethod()
に加入している誰に送信します。
Component1
はdata
をMyService
に送信しています。 Component2
はmyMethod()
に登録されていますので、myMethod()
が呼び出されるたびにComponent2
は返信し、myMethod()
が返すものを取得します。
サービスコンストラクタは、コンポーネントにインジェクトした時点ですでに実行されています。初期化していないため、その時点では 'data'は定義されていません。 –
オブジェクトのメソッドを呼び出す前に、そのオブジェクトを構築する必要があります。したがって、コンストラクタが呼び出され、データは未定義です。その後、メンバにアクセスして変数を変更しますが、コンストラクタはすでに呼び出されています。 – Akkusativobjekt
どうすれば修正できますか? – TeodorKolev