Задать вопрос
StivinKing
@StivinKing

HostListener document:click для одного компонента среди множества копий?

Доброго времени суток,

Есть компонент, который выводит строку при нажатии на которую всплывает форма для редактирования этой строки.
Этот компонент используется в таблицах, то есть в одной таблице ~ по 50 копий этого компонента.
Ну так вот, нужно сделать так, чтобы при клике вне области компонента, компонент закрывался.
Пишу так:
...
@HostListener('document:keyup', ['$event'])
public handleClick(event) {
  if (!this.editable.nativeElement.contains(event.target)) this.onClose();
}

Но при открытии и последующем клике вне области компонента данный метод срабатывает все 50 раз (сколько компонентов на странице). Из-за этого все немного затормаживается (пауза закрытия на 1,5 секунды)
Можно как-то разграничить компоненты между собою? Чтобы данный метод срабатывал только для открытого компонента?
  • Вопрос задан
  • 1197 просмотров
Подписаться 1 Оценить 10 комментариев
Решения вопроса 1
Вы можете возложить обязанности по обработке закрытия на специальную директиву, которая может выглядить как

@Directive({
    selector: '[outsideClickHandler]',
})
export class OutsideClickDirective {
    @Output('outsideClickHandler') close = new EventEmitter();

    isOpen: boolean = false;

    constructor(private elRef: ElementRef) {}

    @HostListener('document:click', ['$event'])
    public handleClick(event) {
      if (!this.isOpen)  {
          this.isOpen = true;
      } else if (!this.elRef.nativeElement.contains(event.target)) {
          this.close.emit();
      }
    }
}


после этого легко используйте ее в своем шаблоне

<div class="editable-edit-box" (outsideClickHandler)="onClose()">


Живой пример
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы