Il rendering è stato deprecato in Angular 4.0.0-rc.1, leggi l'aggiornamento di seguito
Il modo angular2 è usare listen
o listenGlobal
da Renderer
Ad esempio, se si desidera aggiungere un evento clic a un componente, è necessario utilizzare Renderer ed ElementRef (questo offre anche l'opzione di utilizzare ViewChild o qualsiasi cosa che recupera il nativeElement
)
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
È possibile utilizzare listenGlobal
che vi darà l'accesso a document
, body
e così via
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
Si noti che da beta.2 entrambi listen
e che listenGlobal
restituiscono una funzione per rimuovere l'ascoltatore (vedere la sezione relativa alla modifica delle modifiche dal log delle modifiche per beta.2). Questo per evitare perdite di memoria nelle grandi applicazioni (vedi # 6686 ).
Quindi per rimuovere il listener che abbiamo aggiunto dinamicamente dobbiamo assegnare listen
o listenGlobal
a una variabile che conterrà la funzione restituita, e quindi la eseguiremo.
// 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();
}
Ecco un plnkr con un esempio funzionante. L'esempio contiene l'uso di listen
e listenGlobal
.
Utilizzo di RendererV2 con Angular 4.0.0-rc.1 + (Renderer2 dalla 4.0.0-rc.3)
25/02/2017 : Renderer
è stato deprecato, ora dovremmo usare RendererV2
(vedi riga sotto). Vedi il commit .
10/03/2017 : è RendererV2
stato rinominato in Renderer2
. Vedi i cambiamenti di rottura .
RendererV2
non ha più listenGlobal
funzione per eventi globali (documento, corpo, finestra). Ha solo una listen
funzione che raggiunge entrambe le funzionalità.
Per riferimento, sto copiando e incollando il codice sorgente dell'implementazione di DOM Renderer poiché potrebbe cambiare (sì, è angolare!).
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;
}
Come puoi vedere, ora verifica se stiamo passando una stringa (documento, corpo o finestra), nel qual caso utilizzerà una addGlobalEventListener
funzione interna . In ogni altro caso, quando passiamo un elemento (nativeElement) userà un sempliceaddEventListener
Per rimuovere l'ascoltatore è lo stesso di Renderer
in angolare 2.x. listen
restituisce una funzione, quindi chiama quella funzione.
Esempio
// 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 con Angular 4.0.0-rc.1 usando RendererV2
plnkr con Angular 4.0.0-rc.3 usando Renderer2