O renderizador foi descontinuado no Angular 4.0.0-rc.1, leia a atualização abaixo
A maneira angular2 é usar listenou listenGlobaldo Renderer
Por exemplo, se você deseja adicionar um evento de clique a um Componente, é necessário usar o Renderer e ElementRef (isso também oferece a opção de usar o ViewChild ou qualquer coisa que recupere o nativeElement)
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
Você pode usar listenGlobalque lhe dará acesso a document, body, etc.
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
Observe que, desde o beta.2 ambos listene listenGlobalretorne uma função para remover o ouvinte (consulte a seção de alterações recentes do changelog para o beta.2). Isso é para evitar vazamentos de memória em grandes aplicativos (consulte # 6686 ).
Portanto, para remover o ouvinte que adicionamos dinamicamente, devemos atribuir listenou listenGlobala uma variável que reterá a função retornada e depois a executamos.
// 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();
}
Aqui está um plnkr com um exemplo de trabalho. O exemplo contém o uso de listene listenGlobal.
Usando o RendererV2 com Angular 4.0.0-rc.1 + (Renderer2 desde 4.0.0-rc.3)
25/02/2017 : Rendererfoi descontinuado, agora devemos usar RendererV2(veja a linha abaixo). Veja o commit .
10/03/2017 : RendererV2renomeado para Renderer2. Veja as mudanças mais recentes .
RendererV2não tem mais listenGlobalfunção para eventos globais (documento, corpo, janela). Ele tem apenas uma listenfunção que atinge ambas as funcionalidades.
Para referência, estou copiando e colando o código fonte da implementação do DOM Renderer, pois ele pode mudar (sim, é 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 você pode ver, agora verifica se estamos passando uma string (documento, corpo ou janela); nesse caso, ele usará uma addGlobalEventListenerfunção interna . Em qualquer outro caso, quando passarmos um elemento (nativeElement), ele usará um simplesaddEventListener
Para remover o ouvinte, é igual Rendererao angular 2.x. listenretorna uma função e chame essa função.
Exemplo
// 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 com Angular 4.0.0-rc.1 usando RendererV2
plnkr com Angular 4.0.0-rc.3 usando o Renderer2