提问者:小点点

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


是否需要根据控制取消订阅事件。

HTMLInput:

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

表单组:

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

寻求对这里发生的事情有更深入的理解:

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

更新忘记提到:在我的测试中,我发现blur$在组件销毁后是未定义的,如果取消订阅会抛出错误。然而,valChange$. un订阅()不会抛出错误,但它们都属于同一个组件。


共2个答案

匿名用户

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

没有任何机制可以观察事件的目标“存在”本身并自动为您取消订阅可观察对象。

FromEventWatable也尝试尽可能通用。它不期望您的目标是超文本标记语言DOM节点。

最低期望是,你的目标有一个addEventListener和一个RemoveEventListener方法。这意味着它不能跟踪理论上的“元素被移除/销毁事件”。FromEventObtivable理论上可以检测超文本标记语言节点并给予它们特殊处理,但这会导致不同目标类型之间的行为不一致。

太长别读了

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

匿名用户

不,如果目标元素被销毁,您不需要取消订阅。如果元素被销毁,那么所有事件侦听器也会被销毁,就像如果DOM元素被删除,它的侦听器也会从内存中删除吗?

你的事件监听器不会阻止元素被销毁。如果你挂在订阅上(从订阅返回),它会一直存在,直到你不再引用它。一旦你停止引用它,它也会被清理。

如果您有任何完整订阅,它们将不会被触发。可观察对象不会“完成”,它只是不再触发。

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