Renderer устарел в Angular 4.0.0-rc.1, прочтите обновление ниже
Angular2 способ заключается в использовании listen
или listenGlobal
от видеообработки
Например, если вы хотите добавить событие щелчка к компоненту, вы должны использовать Renderer и ElementRef (это также дает вам возможность использовать ViewChild или что-нибудь, что извлекает nativeElement
)
constructor(elementRef: ElementRef, renderer: Renderer) {
renderer.listen(elementRef.nativeElement, 'click', (event) => {
})
);
Вы можете использовать listenGlobal
это даст вам доступ к document
, body
и т.д.
renderer.listenGlobal('document', 'click', (event) => {
});
Обратите внимание , что с beta.2 как listen
и listenGlobal
возвращает функцию для удаления слушателя (см отличий раздела из журнала изменений для beta.2). Это сделано для того, чтобы избежать утечки памяти в больших приложениях (см. № 6686 ).
Итак, чтобы удалить динамически добавленного слушателя, мы должны назначить listen
или listenGlobal
переменной, которая будет содержать возвращаемую функцию, а затем мы ее выполним.
listenFunc: Function;
globalListenFunc: Function;
constructor(elementRef: ElementRef, renderer: Renderer) {
this.listenFunc = renderer.listen(elementRef.nativeElement, 'click', (event) => {
});
this.globalListenFunc = renderer.listenGlobal('document', 'click', (event) => {
});
}
ngOnDestroy() {
this.listenFunc();
this.globalListenFunc();
}
Вот plnkr с примером работы. Пример содержит использование listen
и listenGlobal
.
Использование RendererV2 с Angular 4.0.0-rc.1 + (Renderer2 начиная с 4.0.0-rc.3)
25.02.2017 : Renderer
устарело, теперь мы должны использовать RendererV2
(см. Строку ниже). Смотрите коммит .
03.10.2017 : RendererV2
переименован в Renderer2
. Смотрите критические изменения .
RendererV2
больше не имеет listenGlobal
функции для глобальных событий (документ, тело, окно). У него есть только listen
функция, которая выполняет обе функции.
Для справки, я копирую и вставляю исходный код реализации DOM Renderer, поскольку он может измениться (да, это угловой!).
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;
}
Как видите, теперь он проверяет, передаем ли мы строку (документ, тело или окно), и в этом случае он будет использовать внутреннюю addGlobalEventListener
функцию. В любом другом случае, когда мы передаем элемент (nativeElement), он будет использовать простойaddEventListener
Чтобы удалить слушателя, он такой же, как и Renderer
в angular 2.x. listen
возвращает функцию, затем вызывает эту функцию.
пример
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);
});
global();
simple();
plnkr с Angular 4.0.0-rc.1 с использованием RendererV2
plnkr с Angular 4.0.0-rc.3 с использованием Renderer2