Renderer stał się przestarzały w Angular 4.0.0-rc.1, przeczytaj aktualizację poniżej
Sposób angular2 polega na użyciu listen
lub listenGlobal
z Renderer
Na przykład, jeśli chcesz dodać zdarzenie kliknięcia do komponentu, musisz użyć Renderer i ElementRef (daje to również opcję użycia ViewChild lub czegokolwiek, co pobiera nativeElement
)
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
Można użyć listenGlobal
, który daje dostęp do document
, body
itp
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
Należy zauważyć, że zarówno od beta.2 listen
i listenGlobal
powrócić do funkcji, aby usunąć słuchacza (patrz łamanie zmienia sekcję z changelogu dla beta.2). Ma to na celu uniknięcie wycieków pamięci w dużych aplikacjach (patrz # 6686 ).
Aby więc dynamicznie usunąć detektor, który dodaliśmy, musimy przypisać listen
lub listenGlobal
do zmiennej, która będzie przechowywać zwróconą funkcję, a następnie ją wykonać.
// 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();
}
Oto plnkr z działającym przykładem. Przykład zawiera użycie listen
i listenGlobal
.
Używanie RendererV2 z Angular 4.0.0-rc.1 + (Renderer2 od 4.0.0-rc.3)
25/02/2017 : Renderer
został wycofany, teraz powinniśmy użyć RendererV2
(zobacz wiersz poniżej). Zobacz zatwierdzenie .
10/03/2017 : RendererV2
nazwa została zmieniona na Renderer2
. Zobacz przełomowe zmiany .
RendererV2
nie ma już listenGlobal
funkcji dla zdarzeń globalnych (dokument, treść, okno). Ma tylko listen
funkcję, która osiąga obie funkcjonalności.
Dla porównania, kopiuję i wklejam kod źródłowy implementacji DOM Renderer, ponieważ może się zmienić (tak, jest kątowy!).
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;
}
Jak widać, teraz sprawdza, czy przekazujemy ciąg (dokument, treść lub okno), w takim przypadku użyje addGlobalEventListener
funkcji wewnętrznej . W każdym innym przypadku, gdy przekażemy element (nativeElement), użyje on prostejaddEventListener
Usunięcie słuchacza jest takie samo, jak Renderer
w przypadku angular 2.x. listen
zwraca funkcję, a następnie wywołuje tę funkcję.
Przykład
// 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 z Angular 4.0.0-rc.1 przy użyciu RendererV2
plnkr z Angular 4.0.0-rc.3 przy użyciu Renderer2
host
są one używane.ngOnDestroy
kod, obalisten
ilistenGlobal
zwracają funkcję, która po wywołaniu / wykonaniu nasłuchiwania jest usuwana. Więc jak widzisz,this.func
trzyma funkcję zwróconą przez,renderer.listen
a kiedy to zrobięthis.func()
, usuwam detektor. To samo dotyczylistenGlobal
.Uważam to również za wyjątkowo zagmatwane. jak wskazuje @EricMartinez, Renderer2 listen () zwraca funkcję usuwającą nasłuchiwanie:
Jeśli dodaję słuchacza
Spodziewałbym się, że moja funkcja wykona to, co zamierzałem, a nie całkowite przeciwieństwo, czyli usunięcie słuchacza.
W danym scenariuszu bardziej sensowne byłoby nazwanie go następująco:
Musi być ku temu dobry powód, ale moim zdaniem jest to bardzo mylące i nie intuicyjne.
źródło
ngOnDestroy
metody. Przyznaję, że na początku może się to wydawać zagmatwane, ale w rzeczywistości jest to bardzo przydatna funkcja. Jak inaczej posprzątać po sobie?Dodam przykład StackBlitz oraz komentarz do odpowiedzi z @tahiche.
Wartość zwracana to funkcja służąca do usuwania detektora zdarzeń po jego dodaniu. Za dobrą praktykę uważa się usuwanie detektorów zdarzeń, gdy ich już nie potrzebujesz. Możesz więc przechowywać tę wartość zwracaną i wywoływać ją wewnątrz swojej
ngOnDestroy
metody.Przyznaję, że na początku może się to wydawać zagmatwane, ale w rzeczywistości jest to bardzo przydatna funkcja. Jak inaczej możesz po sobie posprzątać?
Możesz znaleźć StackBlitz tutaj, aby pokazać, jak to może działać w przypadku łapania klikania elementów kotwicy.
Dodałem ciało z następującym obrazem:
<img src="x" onerror="alert(1)"></div>
aby pokazać, że środek odkażający wykonuje swoją pracę.
Tutaj, na tych skrzypcach , znajdziesz to samo ciało przymocowane do niego
innerHTML
bez odkażania go i to zademonstruje problem.źródło
Oto moje obejście:
Stworzyłem bibliotekę za pomocą Angular 6. Dodałem wspólny komponent,
commonlib-header
który jest używany w taki sposób w zewnętrznej aplikacji.Zwróć uwagę,
serviceReference
która jest klasą (wstrzykniętą w składniku,constructor(public serviceReference: MyService)
który używacommonlib-header
), która przechowujestringFunctionName
metodę:Komponent biblioteki jest programowany w ten sposób. Zdarzenie dynamiczne jest dodawane w
onClick(fn: any)
metodzie:Wielokrotnego użytku
header.component.html
:źródło