Есть ли пример, когда мне не нужно обрабатывать отписку в компоненте? - PullRequest
0 голосов
/ 05 декабря 2018

Я привык отписываться от подписок, которые я инициализирую в своих компонентах.Рекомендуемый подход - использовать оператор takeUntil следующим образом:

killSubscriptions: new Subject<any> = new Subject();

ngOnInit(){
   observableThing().pipe(takeUntil(this.killSubscriptions)).subscribe()
}

ngOnDestroy(){
  this.killSubscriptions.next();
  this.killSubscriptions.complete();
}

Но на днях я реализовал пользовательский диалог со службой наложения и портала, и наткнулся на этот блоккода в середине метода в библиотеке угловых материалов .

// When the dialog backdrop is clicked, we want to close it.
if (config.hasBackdrop) {
  overlayRef.backdropClick().subscribe(() => {
    if (!dialogRef.disableClose) {
      dialogRef.close();
    }
  });
}

Как очищается эта подписка?Мое единственное предположение - когда утилизируется overlayRef, подписка очищается.Но как?

Есть ли другие случаи, когда нам не нужно обрабатывать отписку?

1 Ответ

0 голосов
/ 05 декабря 2018

Краткий ответ

Поскольку они завершают работу наблюдателя, когда OverlayRef считается находящимся в состоянии утилизации.

this._backdropClick.complete();

Исходный код CDK углового материала

Надеюсь, это поможет! Изучение исходного кода и попытка понять, что это хороший и интересный способ изучения:)

Редактировать: Если вы не уверены, что ваш наблюдатель завершит работутогда вам нужно убедиться, что вы активно отписываетесь, чтобы избежать утечки памяти.Ваш шаблон takeUntil - один из способов.Вы даже можете изменить тип с any на void для вашего предмета.

...