我遇到的问题我确信完全基于我(缺乏)对Observables的完整理解。
这是一个使用rx / js和Observables的Angular2(v4.0.3)项目。
我有一个状态存储,用于保存状态服务中的事件:
// Observable string sources
private currentEventStore = new BehaviorSubject<string>("");
// Observable string streams
public currentEvent$ = this.currentEventStore.asObservable();
// Service message commands
setCurrentEvent(nextEvent: string) {
this.currentEventStore.next(nextEvent);
}
我在我的组件中订阅了currentEvent $来监听事件,然后对它们采取行动。
this.stateSvc.currentEvent$
.subscribe(
currentEvent => {
this.currentEvent = currentEvent;
if (currentEvent != '') {
this.handleCurrentEvent(currentEvent);
}
});
我遇到的问题是商店正在累积所有事件并且每次都返回所有事件,因此当我生成'create'事件时,我订阅的函数会选择事件并创建记录 - 完美的第一次传递,但是如果我产生第二个'create'事件,我订阅的函数会获取2个事件,并创建2个记录,而在下一个'create'事件中它会创建3个记录,依此类推。
我需要做的是将事件从流中刷新,以便currentEvent $ store仅保存尚未解决的事件。
有没有办法冲洗商店?或者我的期望和实施中是否有一些我缺少的东西?
答案 0 :(得分:1)
通常情况下,在对问题进行了几天的攻击之后,在发布问题的几个小时内我就找到了答案。
这里的问题是,每当我重新访问注册订阅者的组件时,它会向观察者添加一个新订阅者,以便在第二次访问时,有两个订阅者,每个订阅者都会触发,从而导致事件被处理两次。第三次回来,现在有三个订阅者,所以事件被处理了三次。
我需要做的是修改我的订阅以便将它们分配给变量,然后在销毁组件时取消订阅。
所以订阅应该是这样的(请注意添加&#39; this.observeEvent =&#39; :
else
我将其添加到组件中:
this.observeEvent = this.stateSvc.currentEvent$
.subscribe(
currentEvent => {
this.currentEvent = currentEvent;
if (currentEvent != '') {
this.handleCurrentEvent(currentEvent);
}
});
未注册订阅者,因此每次加载此组件时他们都不会累积。
我曾试图弄清楚如何更早地完成这项工作,但是如果没有将Observable分配给实例变量,我就无法在ngOnDestroy方法中找到任何有效的取消订阅语法。