Как отписаться от всех наблюдателей, которые наблюдали за наблюдениями, сделанными из 'fromEvent'? - PullRequest
0 голосов
/ 24 октября 2018

Допустим, я перебираю массив, чтобы элементы выглядели примерно так:

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');

Теперь я могу подписаться на клик что-то вроде этого:

divEl.onclick$.subscribe(...);

Однако что, если я перерисовываю все элементы div, созданные во время зацикливания спискамассив?

Чтобы отменить наблюдение, я должен был вызвать отписку, которая включается в возвращаемое значение подписки:

const a$ = divEl.onClick$.subscribe(...);

...

a$.unsubscribe();

Это довольно неудобно, особенно с точки зрения модульной / библиотечной разработки.

Есть ли способ отписать всех наблюдателей от divEl.onclick $ в этом случае?

Любой совет будет очень признателен.

1 Ответ

0 голосов
/ 24 октября 2018

Возможно, вы можете использовать оператор 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();

Каждая заметка, для которой вы используете оператор takeUntil, отменит подписку при изменении значения внутри заметки unsubscriber $

...