Jak mogę wykryć kliknięcia poza komponentem w Angular?
html
events
angular
typescript
AMagyar
źródło
źródło
Odpowiedzi:
Działający przykład - kliknij tutaj
źródło
Alternatywa dla odpowiedzi AMagyara. Ta wersja działa, gdy klikniesz element, który zostanie usunięty z DOM za pomocą ngIf.
http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview
źródło
Powiązanie z kliknięciem dokumentu przez @Hostlistener jest kosztowne. Może i będzie miało widoczny wpływ na wydajność, jeśli nadużyjesz (na przykład podczas tworzenia niestandardowego komponentu rozwijanego i masz wiele instancji utworzonych w formularzu).
Sugeruję dodanie @Hostlistener () do zdarzenia kliknięcia dokumentu tylko raz w głównym komponencie aplikacji. Zdarzenie powinno wypchnąć wartość klikniętego elementu docelowego do podmiotu publicznego przechowywanego w globalnej usłudze użyteczności publicznej.
Każdy, kto jest zainteresowany klikniętym elementem docelowym, powinien zapisać się do publicznego przedmiotu naszej usługi użyteczności publicznej i zrezygnować z subskrypcji, gdy komponent zostanie zniszczony.
źródło
Powyższe odpowiedzi są poprawne, ale co, jeśli wykonujesz ciężki proces po utracie koncentracji na odpowiednim komponencie. W tym celu przyszedłem z rozwiązaniem z dwiema flagami, w których proces skupienia uwagi będzie miał miejsce tylko wtedy, gdy utraci fokus tylko z odpowiedniego komponentu.
Mam nadzieję, że to ci pomoże. Popraw mnie, jeśli coś przeoczyłem.
źródło
Możesz użyć metody eclickOutside () z https://www.npmjs.com/package/ng-click-outside package
źródło
Odpowiedź ginalx powinna być ustawiona jako domyślna imo: ta metoda pozwala na wiele optymalizacji.
Problem
Powiedzmy, że mamy listę pozycji i do każdej pozycji chcemy dołączyć menu, które trzeba przełączać. Dołączamy przełącznik na przycisku, który nasłuchuje
click
zdarzenia samego w sobie(click)="toggle()"
, ale chcemy również przełączać menu, gdy użytkownik kliknie poza nim. Jeśli lista pozycji się powiększy i dołączymy do@HostListener('document:click')
każdego menu, to każde menu załadowane w ramach pozycji zacznie nasłuchiwać kliknięcia na całym dokumencie, nawet jeśli menu jest wyłączone. Oprócz oczywistych problemów z wydajnością jest to niepotrzebne.Możesz na przykład subskrybować, gdy wyskakujące okienko zostanie przełączone za pomocą kliknięcia i dopiero wtedy zacznij nasłuchiwać „zewnętrznych kliknięć”.
Oraz w
*.component.html
:źródło
tap
operatora. Zamiast tego użyjskipWhile(() => !this.isActive), switchMap(() => this._utilitiesService.documentClickedTarget), filter((target) => !this._elementRef.nativeElement.contains(target)), tap(() => this._toggleMenuSubject$.next(false))
. W ten sposób wykorzystujesz znacznie więcej RxJ i pomijasz niektóre subskrypcje.Poprawianie @J. Odpowiedzi Frankensteina
źródło
Możesz wywołać funkcję zdarzenia, taką jak (focusout) lub (blur), a następnie umieścić kod
źródło