Renderer telah ditinggalkan dalam Angular 4.0.0-rc.1, baca pembaruan di bawah ini
Cara angular2 adalah menggunakan listen
atau listenGlobal
dari Renderer
Misalnya, jika Anda ingin menambahkan acara klik ke Komponen, Anda harus menggunakan Renderer dan ElementRef (ini memberi Anda juga opsi untuk menggunakan ViewChild, atau apa pun yang mengambil nativeElement
)
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
Anda dapat menggunakan listenGlobal
yang akan memberikan Anda akses ke document
, body
, dll
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
Perhatikan bahwa sejak beta.2 keduanya listen
dan listenGlobal
mengembalikan fungsi untuk menghapus pendengar (lihat memecah bagian perubahan dari changelog untuk beta.2). Ini untuk menghindari kebocoran memori pada aplikasi besar (lihat # 6686 ).
Jadi untuk menghapus pendengar kita menambahkan secara dinamis kita harus menetapkan listen
atau listenGlobal
ke variabel yang akan menahan fungsi dikembalikan, dan kemudian kita jalankan.
// listenFunc will hold the function returned by "renderer.listen"
listenFunc: Function;
// globalListenFunc will hold the function returned by "renderer.listenGlobal"
globalListenFunc: Function;
constructor(elementRef: ElementRef, renderer: Renderer) {
// We cache the function "listen" returns
this.listenFunc = renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
});
// We cache the function "listenGlobal" returns
this.globalListenFunc = renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
}
ngOnDestroy() {
// We execute both functions to remove the respectives listeners
// Removes "listen" listener
this.listenFunc();
// Removs "listenGlobal" listener
this.globalListenFunc();
}
Berikut ini adalah plnkr dengan contoh yang berfungsi. Contoh tersebut berisi penggunaan listen
dan listenGlobal
.
Menggunakan RendererV2 dengan Angular 4.0.0-rc.1 + (Renderer2 sejak 4.0.0-rc.3)
25/02/2017 : Renderer
telah ditinggalkan, sekarang kita harus menggunakan RendererV2
(lihat baris di bawah). Lihat komit .
10/03/2017 : RendererV2
diubah namanya menjadi Renderer2
. Lihat perubahan yang melanggar .
RendererV2
tidak memiliki listenGlobal
fungsi lagi untuk acara global (dokumen, badan, jendela). Ini hanya memiliki listen
fungsi yang mencapai kedua fungsi.
Untuk referensi, saya menyalin & menempelkan kode sumber implementasi DOM Renderer karena mungkin berubah (ya, itu sudut!).
listen(target: 'window'|'document'|'body'|any, event: string, callback: (event: any) => boolean):
() => void {
if (typeof target === 'string') {
return <() => void>this.eventManager.addGlobalEventListener(
target, event, decoratePreventDefault(callback));
}
return <() => void>this.eventManager.addEventListener(
target, event, decoratePreventDefault(callback)) as() => void;
}
Seperti yang Anda lihat, sekarang memverifikasi jika kita melewati sebuah string (dokumen, badan atau jendela), dalam hal ini akan menggunakan addGlobalEventListener
fungsi internal . Dalam kasus lain, ketika kita melewati elemen (nativeElement) itu akan menggunakan yang sederhanaaddEventListener
Untuk menghapus pendengar itu sama dengan Renderer
di sudut 2.x. listen
mengembalikan fungsi, lalu memanggil fungsi itu.
Contoh
// Add listeners
let global = this.renderer.listen('document', 'click', (evt) => {
console.log('Clicking the document', evt);
})
let simple = this.renderer.listen(this.myButton.nativeElement, 'click', (evt) => {
console.log('Clicking the button', evt);
});
// Remove listeners
global();
simple();
plnkr dengan Angular 4.0.0-rc.1 menggunakan RendererV2
plnkr dengan Angular 4.0.0-rc.3 menggunakan Renderer2
host
digunakan juga.ngOnDestroy
kode, keduanyalisten
danlistenGlobal
mengembalikan fungsi yang ketika dipanggil / dieksekusi pendengar dihapus. Jadi seperti yang Anda lihatthis.func
adalah menahan fungsi yang dikembalikan olehrenderer.listen
dan ketika saya melakukannyathis.func()
saya menghapus pendengar. Hal yang sama berlaku untuklistenGlobal
.Saya juga menemukan ini sangat membingungkan. sebagai @EricMartinez menunjukkan Renderer2 listen () mengembalikan fungsi untuk menghapus pendengar:
Jika saya menambahkan pendengar
Saya mengharapkan fungsi saya untuk mengeksekusi apa yang saya inginkan, bukan kebalikan total yang menghapus pendengar.
Dalam skenario yang diberikan, sebenarnya lebih masuk akal untuk memberi nama seperti:
Pasti ada alasan bagus untuk ini, tetapi menurut saya itu sangat menyesatkan dan tidak intuitif.
sumber
ngOnDestroy
metode Anda . Saya akui bahwa itu mungkin tampak membingungkan pada awalnya, tetapi sebenarnya ini adalah fitur yang sangat berguna. Bagaimana lagi membersihkan setelah dirimu sendiri?Saya akan menambahkan contoh StackBlitz dan komentar untuk jawaban dari @tahiche.
Nilai kembali adalah fungsi untuk menghapus pendengar acara setelah Anda menambahkannya. Ini dianggap praktik yang baik untuk menghapus pendengar acara ketika Anda tidak membutuhkannya lagi. Jadi, Anda dapat menyimpan nilai pengembalian ini dan menyebutnya di dalam
ngOnDestroy
metode Anda .Saya akui bahwa itu mungkin tampak membingungkan pada awalnya, tetapi sebenarnya ini adalah fitur yang sangat berguna. Bagaimana lagi Anda bisa membersihkan diri sendiri?
Anda dapat menemukan StackBlitz di sini untuk menunjukkan bagaimana ini bisa bekerja untuk menangkap klik pada elemen jangkar.
Saya menambahkan tubuh dengan gambar sebagai berikut:
<img src="x" onerror="alert(1)"></div>
untuk menunjukkan bahwa pembersih sedang melakukan tugasnya.
Di sini, di biola ini Anda menemukan tubuh yang sama melekat pada
innerHTML
tanpa membersihkannya dan itu akan menunjukkan masalah.sumber
Inilah solusi saya:
Saya membuat perpustakaan dengan Angular 6. Saya menambahkan komponen umum
commonlib-header
yang digunakan seperti ini dalam aplikasi eksternal.Perhatikan
serviceReference
yang merupakan kelas (disuntikkan dalam komponenconstructor(public serviceReference: MyService)
yang menggunakancommonlib-header
) yang menampungstringFunctionName
metode:Komponen perpustakaan diprogram seperti ini. Acara dinamis ditambahkan dalam
onClick(fn: any)
metode:Dapat digunakan kembali
header.component.html
:sumber