Renderer застарілий у Angular 4.0.0-rc.1, читайте оновлення нижче
Спосіб angular2 полягає у використанні listenабо listenGlobalвід рендерера
Наприклад, якщо ви хочете додати подію клацання до компонента, вам потрібно використовувати 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повернути функцію для видалення слухача (див. Розділ " Розрив змін " із журналу змін для beta.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 з кутовим 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 у кутовій 2.х. 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 з кутовим 4.0.0-rc.1 з використанням RendererV2
plnkr з кутовим 4.0.0-rc.3 за допомогою Renderer2