2017-10-07 24 views
0

私の角型コンポーネントの1つは、保持している番号にサブスクリプションを許可する必要があります。私はこの数字を観測可能なものに変えて他の人がそれを購読できるようにしようとしています。Rxjs観測可能なサブスクリプションが決して正確に公開されない

私の出版社が私の観察者が

 this.historyComponent.getHistoricalCount() 
     .subscribe(count => { 
      if (count !== 0) { 
       console.log('new history timespan expanded: ', count); 
       this.historyCount = count; 
       this.retrieveHistoricalData(); 
      } 
     }); 

のように見えるが、加入者が呼ばれることは決してありません

private countChanged = new BehaviorSubject<any>(null); 
public historyTimespanChanged$ = this.countChanged.asObservable(); 

private publish() { 
    this.countChanged.next(this.count); 
} 

expandTimeSpan() { 
    this.count ++; 
    this.publish(); 
} 

reset() { 
    this.count = 0; 
    this.publish(); 
} 

getHistoricalCount() { 
    return Observable.of(this.count); 
} 

のように見えます。 誰かが私が間違っていることを見ることができますか?

答えて

1

this.historyComponent.getHistoricalCount()の代わりに、あなたが公開しているBehaviorSubjectに由来するthis.historyComponent.historyTimespanChanged$.subscribe(...)を意味すると思われます。サイドノートでは


countのすべての突然変異に this.publishを追加の危険性と退屈を避けるために、あなたはES6セッターを自分で ReactivePropertyに見たり、それをやってみたいことがあります。

class HistoryComponent { 
    ... 

    set count(value: number): bool { 
    this.countChanged.next(value); 
    this.count = value; 
    return true; 
    } 
    ... 
} 
+0

私は好奇心が強いですが、 BehaviourSubjectはObservableではない? OPはそれにサブスクリプションを直接作成してはいけませんか? – adz5A

+0

@ adz5Aです。 'as Observable'を介した真の' Observable'への変換はちょっと防御的です。それは、上流に値を送ることによって加入者が誤ってSubjectを汚染するのを防ぎます。 – concat

0

コンポーネントのクラス全体を共有できますか?あなたの購読が一度だけ呼び出されると、その値として0があるため、if節は決して実行されません。

getHistoricalCount() { 
    return Observable.of(this.count); 
} 

は一つの値だけの観測を返します:v-|、あなたはすべてのpublish呼び出しにより更新されるthis.historyComponent.countChangedプロパティを返すようにしてください。

+0

私はいけませんcountChangedプロパティを持つあなたに従っていない – reza

+0

あなたが投稿したものがes6クラスの本体であると思われます。私はプライベートフィールドの宣言+初期化と間違っていない場合は、上の 'private countChanged = new BehaviorSubject (null);つまり、Observable.of(this.count)は長さ1の '> 'です。 – adz5A

関連する問題