Bagaimana cara mendeteksi klik di luar komponen di Angular?
html
events
angular
typescript
AMagyar
sumber
sumber
Jawaban:
Contoh kerja - klik di sini
sumber
Alternatif jawaban AMagyar. Versi ini berfungsi saat Anda mengklik elemen yang dihapus dari DOM dengan ngIf.
http://plnkr.co/edit/4mrn4GjM95uvSbQtxrAS?p=preview
sumber
Mengikat ke dokumen klik melalui @Hostlistener itu mahal. Ini dapat dan akan memiliki dampak kinerja yang terlihat jika Anda menggunakannya secara berlebihan (misalnya, saat membuat komponen tarik-turun khusus dan Anda memiliki beberapa contoh yang dibuat dalam satu formulir).
Saya sarankan menambahkan @Hostlistener () ke acara klik dokumen hanya sekali di dalam komponen aplikasi utama Anda. Peristiwa tersebut harus mendorong nilai elemen target yang diklik di dalam subjek publik yang disimpan dalam layanan utilitas global.
Siapa pun yang tertarik dengan elemen target yang diklik harus berlangganan subjek publik dari layanan utilitas kami dan berhenti berlangganan saat komponen dimusnahkan.
sumber
Jawaban yang disebutkan di atas benar tetapi bagaimana jika Anda melakukan proses yang berat setelah kehilangan fokus dari komponen yang relevan. Untuk itu, saya datang dengan solusi dengan dua flag dimana proses focus out event hanya akan berlangsung ketika kehilangan fokus dari komponen yang relevan saja.
Semoga ini bisa membantu Anda. Koreksi saya Jika melewatkan sesuatu.
sumber
Anda dapat menggunakan metodeeclickOutside () dari https://www.npmjs.com/package/ng-click-outside package
sumber
Jawaban ginalx harus disetel sebagai default imo: metode ini memungkinkan banyak pengoptimalan.
Masalah
Katakanlah kita memiliki daftar item dan pada setiap item kita ingin menyertakan menu yang perlu diubah. Kami menyertakan sakelar pada tombol yang mendengarkan
click
acara itu sendiri(click)="toggle()"
, tetapi kami juga ingin beralih menu setiap kali pengguna mengeklik di luarnya. Jika daftar item bertambah dan kami melampirkan@HostListener('document:click')
di setiap menu, maka setiap menu yang dimuat di dalam item akan mulai mendengarkan klik pada seluruh dokumen, bahkan saat menu dimatikan. Selain masalah kinerja yang jelas, ini tidak perlu.Anda dapat, misalnya, berlangganan setiap kali popup diubah melalui satu klik dan mulai mendengarkan "klik luar" hanya setelah itu.
Dan, di
*.component.html
:sumber
tap
operator. Sebagai gantinya, gunakanskipWhile(() => !this.isActive), switchMap(() => this._utilitiesService.documentClickedTarget), filter((target) => !this._elementRef.nativeElement.contains(target)), tap(() => this._toggleMenuSubject$.next(false))
. Dengan cara ini Anda memanfaatkan lebih banyak RxJ dan melewati beberapa langganan.Meningkatkan @J. Frankenstein menjawab
sumber
Anda dapat memanggil fungsi acara seperti (focusout) atau (blur) lalu Anda memasukkan kode Anda
sumber