2017-10-07 89 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