Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 清除排队事件的行为主体,因为每个事件都在Angular2中用可观察对象进行处理_Javascript_Angularjs_Events_Rxjs_Angular2 Observables - Fatal编程技术网

Javascript 清除排队事件的行为主体,因为每个事件都在Angular2中用可观察对象进行处理

Javascript 清除排队事件的行为主体,因为每个事件都在Angular2中用可观察对象进行处理,javascript,angularjs,events,rxjs,angular2-observables,Javascript,Angularjs,Events,Rxjs,Angular2 Observables,我有一个问题,我确信这完全是基于我(缺乏)对可观察事物的全面理解 这是一个使用rx/js和Observables的Angular2(v4.0.3)项目 我有一个状态存储,用于保存状态服务中的事件: // Observable string sources private currentEventStore = new BehaviorSubject<string>(""); // Observable string streams public currentEve

我有一个问题,我确信这完全是基于我(缺乏)对可观察事物的全面理解

这是一个使用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);
  }
我遇到的问题是,存储正在累积所有事件并每次返回所有事件,因此当我生成一个“创建”事件时,我的订阅函数将拾取该事件并在第一次传递时创建一个完美的记录,但是如果我生成第二个“创建”事件,我的订阅函数将拾取2个事件并创建2个记录,在下一个“创建”事件中,它会创建3条记录,以此类推

我需要做的是将事件从流中清除,以便currentEvent$store只保存尚未寻址的事件


有没有办法冲洗商店?或者,在我的期望和实施过程中,我缺少了什么吗?

通常情况下,在我的头撞上一个问题几天后,在发布一个问题的几个小时内,我就找到了答案

这里的问题是,每次我重新访问注册订阅服务器的组件时,它都会向可观察对象添加一个新的订阅服务器,因此在第二次访问时,有两个订阅服务器,每个订阅服务器都会触发,导致事件被处理两次。第三次返回,现在有三个订阅者,因此事件被处理三次

我需要做的是修改订阅,以便将它们分配给变量,然后在销毁组件时取消订阅

因此订阅应该是这样的(注意添加了'this.observeEvent='

this.observeEvent = this.stateSvc.currentEvent$
  .subscribe(
  currentEvent => {
    this.currentEvent = currentEvent;
    if (currentEvent != '') {
      this.handleCurrentEvent(currentEvent);
    }
  });
我将其添加到组件中:

ngOnDestroy() {
  this.observeEvent.unsubscribe();
}
它取消了订阅服务器的注册,因此它们不会在每次加载此组件时累积


我之前曾试图找出如何实现这一点,但没有将Observable分配给实例变量,我无法在Ngondestory方法中找到任何有效的语法来取消订阅。

唯一的一件事是
BehaviorSubject
在订阅时向每个观察者发送一个默认值(这就是
ReplaySubject
所做的。)它不存储经过的值,因此问题出在其他地方,而不是在使用
BehaviorSubject
时。
ngOnDestroy() {
  this.observeEvent.unsubscribe();
}