私は自分自身の観測可能なサービスを作成しようとしていますが、サービスからの初期データを取得した後、サービスの更新はどのサブスクライバにも伝播しません。サービスは次のようになります。Angular2 Observable BehaviorSubjectサービスが動作しない
import { Injectable } from '@angular/core';
import { Observable, BehaviorSubject } from 'rxjs/Rx';
@Injectable()
export class DataService {
keys : number[] = [4,5,1,3,2];
private data :BehaviorSubject<number[]> = new BehaviorSubject(this.keys);
constructor() {};
public setKey(i:number, val:number) :void {
this.keys[i]=val;
this.data.next(this.keys);
}
public getData() :Observable<number[]> {
return new Observable(fn => this.data.subscribe(fn));
}
public getKeys() :number[] {
return this.keys;
}
}
サービスを使用するコンポーネントは、初期データを正しく取得します。そのコンポーネントはコンストラクタでデータを取得します。
constructor(public dataService: DataService) {
dataService.getData().subscribe(data => {
console.log("Gotcha!");
this.data.datasets[0].data = data)
});
};
これは、コンソールログに1つのGotchaを与えます。しかし、他の場所でsetKey(2,3)を使ってデータを更新した後、私は this.data.next(this.keys);を期待していました。 を使用してすべてのサブスクライバにデータを送信し、データはそれに応じてそのコンポーネント内で更新されます。しかし、データは、購読者に送信されません..
私はObservablesを考え出したと思ったが、私はここでポイントを欠場している場合は親愛なるではありませんしてください;)正しい方向の任意のポインタは非常に感謝されます!
サービスを複数回提供しているため、異なるコンポーネントが異なるインスタンスになっているようです。 –
モジュールで作業するときのアプローチは何でしょうか。私は似たようなサービスを持っています。私のコンポーネントの一部(別のモジュール)は、私の認証サービスで観測可能なものを購読し、変更されたときにデータを受信しますが、他のものはデータを受信しません。例えば。私のログイン(btn)コンポーネントがオブザーバで次回に発行されるとき、ログインコンポーネントは変更を認識しますが、ヘッダーとサイドバーコンポーネントは購読している間は怠惰な読み込みやキャッシュ、またはいくつかの親の子供の問題.. pff – webmaster
@GünterZöchbauerこれはありがとう!私はコンポーネントの一部と親モジュールの両方でサービスを提供していました。それは私を夢中にさせていた! – jminuscula