gpt4 book ai didi

angular - 是否需要根据 fromEvent 取消订阅事件

转载 作者:行者123 更新时间:2023-12-04 13:01:48 25 4
gpt4 key购买 nike

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

HTML输入:

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

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

寻求更深入地了解这里发生的事情:

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

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

最佳答案

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

没有适当的机制来观察事件目标“存在”本身并自动为您取消订阅可观察对象。
FromEventObservable也尽量做到通用。它不希望您的目标是 HTML DOM 节点。

最低期望是,您的目标具有 addEventListener和一个 removeEventListener方法。这意味着它无法跟踪理论上的“元素被移除/销毁事件”。 FromEventObservable理论上可以检测 HTML 节点并对其进行特殊处理,但这会导致不同目标类型之间的行为不一致。

TL;博士

是的,您应该这样做,因为 RxJS 不知道已删除的事件目标。

关于angular - 是否需要根据 fromEvent 取消订阅事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55340118/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com