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