是否需要根据控制取消订阅事件。
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订阅()不会抛出错误,但它们都属于同一个组件。
如果你阅读了FromEvent可观察对象的源代码和文档,你会发现它只是在事件目标元素上添加/删除了一个事件回调。当目标元素在取消订阅可观察对象之前以某种方式被销毁时,回调将永远不会再次执行。然而,可观察对象本身在技术上仍将被“订阅”并等待更多事件。
没有任何机制可以观察事件的目标“存在”本身并自动为您取消订阅可观察对象。
FromEventWatable
也尝试尽可能通用。它不期望您的目标是超文本标记语言DOM节点。
最低期望是,你的目标有一个addEventListener
和一个RemoveEventListener
方法。这意味着它不能跟踪理论上的“元素被移除/销毁事件”。FromEventObtivable
理论上可以检测超文本标记语言节点并给予它们特殊处理,但这会导致不同目标类型之间的行为不一致。
太长别读了
是的,你应该,因为RxJS不知道删除的事件目标。
不,如果目标元素被销毁,您不需要取消订阅。如果元素被销毁,那么所有事件侦听器也会被销毁,就像如果DOM元素被删除,它的侦听器也会从内存中删除吗?
你的事件监听器不会阻止元素被销毁。如果你挂在订阅上(从订阅
返回),它会一直存在,直到你不再引用它。一旦你停止引用它,它也会被清理。
如果您有任何完整
订阅,它们将不会被触发。可观察对象不会“完成”,它只是不再触发。
编辑:必须的,如果您自己不取消订阅,那么您无法控制最后一个事件何时触发,这可能是在您的组件被清理之后,但在元素被实际删除之前,因此您的订阅可能会在您的组件处于不确定状态时触发。