Средство визуализации устарело в Angular 4.0.0-rc.1, прочтите обновление ниже
angular2 - использовать listen
или listenGlobal
из Renderer
Например, если вы хотите добавить событие щелчка к Компоненту, вы должны использовать Renderer и ElementRef (это также дает вам возможность использовать ViewChild или что-нибудь, что извлекает nativeElement
)
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
Вы можете использовать listenGlobal
, который даст вам доступ к document
, body
и т. Д.
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
Обратите внимание, что начиная с версии beta.2 и listen
, и listenGlobal
возвращают функцию для удаления слушателя (см. критические изменения из журнала изменений для бета-версии.2). Это сделано во избежание утечек памяти в больших приложениях (см. # 6686).
Итак, чтобы удалить динамически добавленный слушатель, мы должны назначить listen
или listenGlobal
переменной, которая будет содержать возвращаемую функцию, а затем мы ее выполним.
// 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();
}
Вот 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
возвращает функцию, затем вызывает эту функцию.
Пример
// 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 с Angular 4.0.0-rc.1 с использованием < strong> RendererV2
plnkr с Angular 4.0.0-rc.3 с использованием < strong> Renderer2
person
Eric Martinez
schedule
29.01.2016