Wie kann ich Klicks außerhalb einer Komponente in Angular erkennen?
html
events
angular
typescript
AMagyar
quelle
quelle
Antworten:
Ein funktionierendes Beispiel - hier klicken
quelle
Eine Alternative zu AMagyars Antwort. Diese Version funktioniert, wenn Sie auf ein Element klicken, das mit einer ngIf aus dem DOM entfernt wird.
http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview
quelle
Das Binden an das Klicken von Dokumenten durch @Hostlistener ist kostspielig. Es kann und wird sichtbare Auswirkungen auf die Leistung haben, wenn Sie zu viel verwenden (z. B. beim Erstellen einer benutzerdefinierten Dropdown-Komponente und wenn mehrere Instanzen in einem Formular erstellt wurden).
Ich empfehle, dem Dokumentklickereignis nur einmal in Ihrer Haupt-App-Komponente einen @ Hostlistener () hinzuzufügen. Das Ereignis sollte den Wert des angeklickten Zielelements in ein öffentliches Subjekt verschieben, das in einem globalen Dienstprogrammdienst gespeichert ist.
Wer sich für das angeklickte Zielelement interessiert, sollte das öffentliche Thema unseres Dienstprogrammdienstes abonnieren und sich abmelden, wenn die Komponente zerstört wird.
quelle
Die oben genannten Antworten sind korrekt, aber was ist, wenn Sie einen schweren Prozess ausführen, nachdem Sie den Fokus der relevanten Komponente verloren haben? Dafür habe ich eine Lösung mit zwei Flags geliefert, bei der der Fokus-Out-Ereignisprozess nur stattfindet, wenn der Fokus nur von der relevanten Komponente verloren geht.
Hoffe das wird dir helfen. Korrigieren Sie mich, wenn Sie etwas verpasst haben.
quelle
Sie können die MethodeeclickOutside () unter https://www.npmjs.com/package/ng-click-outside package verwenden
quelle
Die Antwort von ginalx sollte als Standardantwort festgelegt werden: Diese Methode ermöglicht viele Optimierungen.
Das Problem
Angenommen, wir haben eine Liste mit Elementen, und zu jedem Element möchten wir ein Menü hinzufügen, das umgeschaltet werden muss. Wir fügen ein Umschalten auf eine Schaltfläche ein, die auf ein
click
Ereignis an sich wartet(click)="toggle()"
, aber wir möchten auch das Menü umschalten, wenn der Benutzer außerhalb davon klickt. Wenn die Liste der Elemente wächst und wir@HostListener('document:click')
in jedem Menü ein Menü anhängen, wartet jedes im Element geladene Menü auf das Klicken auf das gesamte Dokument, auch wenn das Menü deaktiviert ist. Neben den offensichtlichen Leistungsproblemen ist dies nicht erforderlich.Sie können beispielsweise abonnieren, wenn das Popup per Klick umgeschaltet wird, und erst dann auf "externe Klicks" warten.
Und in
*.component.html
:quelle
tap
Operator zu stecken. Verwenden Sie stattdessenskipWhile(() => !this.isActive), switchMap(() => this._utilitiesService.documentClickedTarget), filter((target) => !this._elementRef.nativeElement.contains(target)), tap(() => this._toggleMenuSubject$.next(false))
. Auf diese Weise nutzen Sie viel mehr RxJs und überspringen einige Abonnements.@J verbessern. Frankenstein answear
quelle