是否需要基于fromEvent取消订阅表单事件

时间:2019-03-25 14:29:44

标签: angular rxjs

是否需要基于控件取消订阅事件。

HTMLInput:

  const blur$ = fromEvent(formEle, 'blur').subscribe(x => {
    this.focused = false;
  });

FormGroup:

  const valChanges$ = this.fGroupRef.get('first_name').valueChanges.subscribe(val => {
  this.hasValue = !!val;
  });

寻求对此处发生的事情的深入了解:

这两个订阅都基于控件的事件,这些事件在离开控件时将被销毁。订阅不会取消订阅吗,因为它不会引用任何内容? ―或― 订阅本身是否创建对所述控件的引用,从而无法进行垃圾回收?

更新忘了提及:在我的测试中,我发现组件销毁后blur $是未定义的,如果取消订阅则将引发错误。但是,valChanges $ .unsubscribe()不会引发错误,但是它们都是同一组件的一部分。

2 个答案:

答案 0 :(得分:0)

如果您阅读FromEventObservable的源代码和文档,将会发现它只是在事件目标元素上添加/删除了事件回调。如果在取消订阅可观察对象之前以某种方式破坏了目标元素,则将不再执行回调。然而,可观察对象本身在技术上仍将“订阅”并等待更多事件。

没有适当的机制来观察事件目标本身的“存在”并自动为您取消订阅可观察的事件。

FromEventObservable也尝试尽可能通用。它不希望您的目标是HTML DOM节点。

最小期望是,您的目标具有addEventListenerremoveEventListener方法。这意味着它无法跟踪理论上的“元素已移除/破坏事件”。 FromEventObservable在理论上可以检测HTML节点并对其进行特殊处理,但这将导致不同目标类型之间的行为不一致。

TL; DR

是的,因为RxJS不知道已删除的事件目标。

答案 1 :(得分:0)

否,如果目标元素已销毁,则无需取消订阅。如果该元素被销毁,那么所有事件监听器也将按照If a DOM Element is removed, are its listeners also removed from memory?

被销毁

您的事件监听器不会阻止该元素被销毁。如果您要订阅(从subscribe返回),它将一直存在直到您不再引用它为止。一旦您停止引用它,它也会被清除。

如果您有任何complete个订阅,它们将不会被解雇。可观察对象不能“完成”,它根本就不会触发。

编辑:强制性的,如果您不退订自己,那么您将无法控制何时可以触发最后一个事件,这可能是在清理组件之后但实际上是在删除元素之前,因此您的订阅可能会触发当您的组件处于不确定状态时。