El procesador ha quedado en desuso en Angular 4.0.0-rc.1, lea la actualización a continuación
La forma angular2 es usar listen
o listenGlobal
desde Renderer
Por ejemplo, si desea agregar un evento de clic a un Componente, debe usar Renderer y ElementRef (esto también le da la opción de usar ViewChild o cualquier cosa que recupere el nativeElement
)
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
Se puede utilizar listenGlobal
que le dará acceso a document
, body
, etc.
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
Tenga en cuenta que dado que tanto beta.2 listen
y listenGlobal
devuelve una función para eliminar el oyente (ver cambios rompiendo la sección de cambios para beta.2). Esto es para evitar pérdidas de memoria en grandes aplicaciones (ver # 6686 ).
Entonces, para eliminar el oyente que agregamos dinámicamente, debemos asignar listen
o listenGlobal
a una variable que contendrá la función devuelta, y luego la ejecutamos.
// 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();
}
Aquí hay un plnkr con un ejemplo funcionando. El ejemplo contiene el uso de listen
y listenGlobal
.
Uso de RendererV2 con Angular 4.0.0-rc.1 + (Renderer2 desde 4.0.0-rc.3)
25/02/2017 : Renderer
ha quedado en desuso, ahora deberíamos usarlo RendererV2
(ver línea a continuación). Ver el compromiso .
10/03/2017 : RendererV2
fue renombrado a Renderer2
. Ver los cambios de última hora .
RendererV2
no tiene más listenGlobal
funciones para eventos globales (documento, cuerpo, ventana). Solo tiene una listen
función que logra ambas funcionalidades.
Como referencia, copio y pego el código fuente de la implementación del DOM Renderer ya que puede cambiar (¡sí, es angular!).
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;
}
Como puede ver, ahora verifica si estamos pasando una cadena (documento, cuerpo o ventana), en cuyo caso utilizará una addGlobalEventListener
función interna . En cualquier otro caso, cuando pasamos un elemento (nativeElement) usará un simpleaddEventListener
Para eliminar el oyente es lo mismo que con Renderer
angular 2.x. listen
devuelve una función, luego llama a esa función.
Ejemplo
// 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
host
se usa también.ngOnDestroy
código, tantolisten
ylistenGlobal
devolver una función que cuando se le llama / ejecuta el oyente se retira. Entonces, como ve,this.func
mantiene la función devuelta porrenderer.listen
y cuando lo hagothis.func()
, estoy eliminando el oyente. Lo mismo vale paralistenGlobal
.A mí esto me parece extremadamente confuso. como @EricMartinez señala Renderer2 listen () devuelve la función para eliminar el oyente:
Si estoy agregando un oyente
Esperaría que mi función ejecute lo que pretendía, no el opuesto total que es eliminar el oyente.
En el escenario dado, en realidad tendría más sentido nombrarlo así:
Debe haber una buena razón para esto, pero en mi opinión es muy engañoso y no intuitivo.
fuente
ngOnDestroy
método. Admito que puede parecer confuso al principio, pero en realidad es una característica muy útil. ¿De qué otra manera limpiar después de ti?Agregaré un ejemplo de StackBlitz y un comentario a la respuesta de @tahiche.
El valor de retorno es una función para eliminar el detector de eventos después de haberlo agregado. Se considera una buena práctica eliminar oyentes de eventos cuando ya no los necesita. Entonces puede almacenar este valor de retorno y llamarlo dentro de su
ngOnDestroy
método.Admito que puede parecer confuso al principio, pero en realidad es una característica muy útil. ¿De qué otra manera puedes limpiar después de ti?
Puede encontrar un StackBlitz aquí para mostrar cómo podría funcionar esto para atrapar al hacer clic en los elementos de anclaje.
Agregué un cuerpo con una imagen de la siguiente manera:
<img src="x" onerror="alert(1)"></div>
para mostrar que el desinfectante está haciendo su trabajo.
Aquí en este violín encontrarás el mismo cuerpo unido a un
innerHTML
sin desinfectarlo y demostrará el problema.fuente
Aquí está mi solución:
Creé una biblioteca con Angular 6. Agregué un componente común
commonlib-header
que se usa así en una aplicación externa.Tenga en cuenta
serviceReference
cuál es la clase (inyectada en el componenteconstructor(public serviceReference: MyService)
que usacommonlib-header
) que contiene elstringFunctionName
método:El componente de la biblioteca se programa así. El evento dinámico se agrega en el
onClick(fn: any)
método:Lo reutilizable
header.component.html
:fuente