【发布时间】:2019-08-15 19:56:50
【问题描述】:
是否需要基于控件取消订阅事件。
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() 不会引发错误,但它们都是同一组件的一部分。
【问题讨论】:
-
创建订阅只要它没有被取消订阅,它就会在框架中保持打开状态。很少有例外情况存在,例如 HTTP 调用,一旦请求完成,这些调用就会结束。据我所知,事件需要取消订阅,因为它们很热:它们对对应于可观察对象的每个事件做出反应。