BACK
Use casesClick outside — закрытие popover
Use cases · 52

Click outside — закрытие popover

Паттерн

Popover, dropdown, контекстное меню — должны закрываться при клике вне компонента. Клик внутри (по контенту, кнопкам, input) — не закрывает, иначе невозможно пользоваться.

Какую проблему решаем

document.addEventListener('click', handler) в ngOnInit без явного removeEventListener в ngOnDestroy — utечка. Handler продолжит вызываться после уничтожения компонента, дёргать this.close() на null-ссылках, бросать ошибки.

Операторы и зачем они нужны

  • filter — predicate проверяет, что target клика НЕ внутри root element компонента.
  • takeUntil(destroy$) — listener умирает вместе с компонентом.
  • map — создаём close event для UI.

Подводные камни

  • stopPropagation() на каждом nested element — антипаттерн. Один outside-click handler чище.
  • Без takeUntil или takeUntilDestroyed document listener живёт вечно — классическая утечка.
  • Если popover рендерится через portal (вне DOM-дерева компонента), наивный elementRef.nativeElement.contains не сработает. Нужна более умная проверка.

Что в итоге получаем

Popover закрывается только при клике снаружи, listener гарантированно снимается при destroy.

script.ts // TypeScript
CONSOLE · Console Output
Нажмите на запуск, чтобы увидеть результат...