2017-10-07 98 views
0

我的一個角度組件需要允許訂閱它所擁有的數字。我試圖把這個數字變成一個可觀測值,以便其他人可以訂閱它。Rxjs可觀察訂閱永遠不會正確發佈

我的出版商看起來像

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); 
} 

我的觀察貌似

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

但用戶不會被調用。 任何人都可以看到我做錯了什麼?

回答

1

我認爲,而不是this.historyComponent.getHistoricalCount(),您可能意味着this.historyComponent.historyTimespanChanged$.subscribe(...),它來自您發佈到BehaviorSubject


在一個側面說明,以避免追加this.publishcount每一個突變的危險,乏味,你可能想看看ReactiveProperty或自己動手用ES6制定者:

class HistoryComponent { 
    ... 

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

我很好奇, BehaviourSubject是不是一個可觀察的? OP是否不直接創建訂閱? – adz5A

+0

@ adz5A它是;通過'asObservable'轉換爲真正的'Observable'只是更具防禦性。它防止用戶通過向上遊發送值而意外污染主體。 – concat

0

你能分享整個組件的類嗎?因爲如果您的訂閱只被調用一次,其值爲0,您的if子句將永遠不會運行。

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

返回可觀察到的只有一個值:v-|,你應該嘗試返回this.historyComponent.countChanged財產由每publish調用更新。

+0

我不有一個countChanged屬性。不關注你 – reza

+0

我懷疑你發佈的是es6類的主體,在頂部的聲明'private countChanged = new BehaviorSubject (null);'如果我沒有弄錯私人字段聲明+初始化。簡而言之,我的意思是返回'this.historyComponent.countChanged',它是一個無限長的可觀察對象,而'Observable.of(this.count)'是一個長度爲1的>。 – adz5A