是否需要基于控件取消订阅事件。
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()不会引发错误,但是它们都是同一组件的一部分。
答案 0 :(得分:0)
如果您阅读FromEventObservable的源代码和文档,将会发现它只是在事件目标元素上添加/删除了事件回调。如果在取消订阅可观察对象之前以某种方式破坏了目标元素,则将不再执行回调。然而,可观察对象本身在技术上仍将“订阅”并等待更多事件。
没有适当的机制来观察事件目标本身的“存在”并自动为您取消订阅可观察的事件。
FromEventObservable
也尝试尽可能通用。它不希望您的目标是HTML DOM节点。
最小期望是,您的目标具有addEventListener
和removeEventListener
方法。这意味着它无法跟踪理论上的“元素已移除/破坏事件”。 FromEventObservable
在理论上可以检测HTML节点并对其进行特殊处理,但这将导致不同目标类型之间的行为不一致。
TL; DR
是的,因为RxJS不知道已删除的事件目标。
答案 1 :(得分:0)
否,如果目标元素已销毁,则无需取消订阅。如果该元素被销毁,那么所有事件监听器也将按照If a DOM Element is removed, are its listeners also removed from memory?
被销毁您的事件监听器不会阻止该元素被销毁。如果您要订阅(从subscribe
返回),它将一直存在直到您不再引用它为止。一旦您停止引用它,它也会被清除。
如果您有任何complete
个订阅,它们将不会被解雇。可观察对象不能“完成”,它根本就不会触发。
编辑:强制性的,如果您不退订自己,那么您将无法控制何时可以触发最后一个事件,这可能是在清理组件之后但实际上是在删除元素之前,因此您的订阅可能会触发当您的组件处于不确定状态时。