Как я могу обнаружить щелчки вне компонента в Angular?
html
events
angular
typescript
AMagyar
источник
источник
Ответы:
Рабочий пример - нажмите здесь
источник
Альтернатива ответу А.М.агьяра. Эта версия работает, когда вы щелкаете элемент, который удаляется из DOM с помощью ngIf.
http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview
источник
Привязка к документу по щелчку через @Hostlistener стоит дорого. Это может и будет иметь видимое влияние на производительность при чрезмерном использовании (например, при создании настраиваемого раскрывающегося компонента и нескольких экземпляров, созданных в форме).
Я предлагаю добавить @Hostlistener () к событию щелчка документа только один раз внутри вашего основного компонента приложения. Событие должно поместить значение выбранного целевого элемента в общедоступную тему, хранящуюся в глобальной служебной службе.
Тот, кто заинтересован в выбранном целевом элементе, должен подписаться на общедоступную тему нашей службы утилит и отказаться от подписки, когда компонент будет уничтожен.
источник
Вышеупомянутые ответы верны, но что, если вы выполняете тяжелый процесс после потери фокуса с соответствующего компонента. Для этого я пришел с решением с двумя флагами, в котором процесс события вывода фокуса будет происходить только при потере фокуса только с соответствующего компонента.
Надеюсь, что это поможет вам. Поправьте меня, если что-то упустили.
источник
Ответ ginalx должен быть установлен как ответ по умолчанию imo: этот метод допускает множество оптимизаций.
Эта проблема
Допустим, у нас есть список элементов, и для каждого элемента мы хотим включить меню, которое нужно переключать. Мы включаем переключатель на кнопку, которая прослушивает
click
само событие(click)="toggle()"
, но мы также хотим переключать меню всякий раз, когда пользователь щелкает вне его. Если список элементов увеличивается и мы добавляем@HostListener('document:click')
значок к каждому меню, тогда каждое меню, загруженное в этот элемент, начнет прослушивать щелчок по всему документу, даже если меню отключено. Помимо очевидных проблем с производительностью, в этом нет необходимости.Вы можете, например, подписаться всякий раз, когда всплывающее окно переключается щелчком мыши, и только тогда начинать прослушивать «внешние щелчки».
И в
*.component.html
:источник
tap
операторе. Вместо этого используйтеskipWhile(() => !this.isActive), switchMap(() => this._utilitiesService.documentClickedTarget), filter((target) => !this._elementRef.nativeElement.contains(target)), tap(() => this._toggleMenuSubject$.next(false))
. Таким образом вы используете гораздо больше RxJ и пропускаете некоторые подписки.Вы можете использовать методclickOutside () из пакета https://www.npmjs.com/package/ng-click-outside
источник
Улучшение @J. Франкенштейн отвечает
источник
вы можете вызвать функцию события, например (focusout) или (blur), затем вы поместите свой код
источник