如何取消订阅所有正在观看来自 'fromEvent' 的观察者?
How to unsubscribe all observers that watching observable made from 'fromEvent'?
假设我正在迭代数组以使元素像这样:
var containerEl = document.createElement('div');
var list = [1, 2, 3, 4, 5];
list.map((data) => {
var divEl = document.createElement('div');
divEl.innerText = data;
// Make observer for click
divEl.onclick$ = fromEvent(divEl, 'click');
containerEl.appendChild(divEl);
});
结果应该是这样的:
<div>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
重要的是我添加了onclick$,这是可以观察到的:
divEl.onclick$ = fromEvent(divEl, 'click');
现在我可以像这样订阅 onclick:
divEl.onclick$.subscribe(...);
但是,如果我重绘在循环列表数组时创建的所有 div 元素会怎样?
要取消订阅观察,我不得不调用取消订阅,它包含在订阅的返回值中:
const a$ = divEl.onClick$.subscribe(...);
...
a$.unsubscribe();
这很不舒服,尤其是从模块化/库开发的角度来看。
在这种情况下,是否有办法取消订阅 divEl.onclick$ 的所有观察者?
如有任何建议,我们将不胜感激。
您可以使用 "takeUntil" 运算符,例如
private unsubscriber$: Subject<boolean> = new Subject<boolean>();
const a$ = divEl.onClick$.takeUntil(this.unsubscriber$).subscribe(...);
---
// you want to unsubscribe
this.unsubscriber$.next(true);
this.unsubscriber$.unsubscribe();
当您更改 "unsubscriber$" 可观察对象
中的值时,您使用 takeUntil 运算符的每个可观察对象都将取消订阅
假设我正在迭代数组以使元素像这样:
var containerEl = document.createElement('div');
var list = [1, 2, 3, 4, 5];
list.map((data) => {
var divEl = document.createElement('div');
divEl.innerText = data;
// Make observer for click
divEl.onclick$ = fromEvent(divEl, 'click');
containerEl.appendChild(divEl);
});
结果应该是这样的:
<div>
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
<div>5</div>
</div>
重要的是我添加了onclick$,这是可以观察到的:
divEl.onclick$ = fromEvent(divEl, 'click');
现在我可以像这样订阅 onclick:
divEl.onclick$.subscribe(...);
但是,如果我重绘在循环列表数组时创建的所有 div 元素会怎样?
要取消订阅观察,我不得不调用取消订阅,它包含在订阅的返回值中:
const a$ = divEl.onClick$.subscribe(...);
...
a$.unsubscribe();
这很不舒服,尤其是从模块化/库开发的角度来看。
在这种情况下,是否有办法取消订阅 divEl.onclick$ 的所有观察者?
如有任何建议,我们将不胜感激。
您可以使用 "takeUntil" 运算符,例如
private unsubscriber$: Subject<boolean> = new Subject<boolean>();
const a$ = divEl.onClick$.takeUntil(this.unsubscriber$).subscribe(...);
---
// you want to unsubscribe
this.unsubscriber$.next(true);
this.unsubscriber$.unsubscribe();
当您更改 "unsubscriber$" 可观察对象
中的值时,您使用 takeUntil 运算符的每个可观察对象都将取消订阅