Der Renderer ist in Angular 4.0.0-rc.1 veraltet. Lesen Sie das folgende Update
Der Angular2-Weg ist die Verwendung von listen
oder listenGlobal
von Renderer
Wenn Sie beispielsweise einer Komponente ein Klickereignis hinzufügen möchten, müssen Sie Renderer und ElementRef verwenden (dies gibt Ihnen auch die Möglichkeit, ViewChild oder alles zu verwenden, was das abruft nativeElement
).
constructor(elementRef: ElementRef, renderer: Renderer) {
// Listen to click events in the component
renderer.listen(elementRef.nativeElement, 'click', (event) => {
// Do something with 'event'
})
);
Sie können verwendet werden, listenGlobal
dass Sie den Zugang zu document
, body
usw.
renderer.listenGlobal('document', 'click', (event) => {
// Do something with 'event'
});
Beachten Sie, dass seit Beta.2 beide listen
und listenGlobal
eine Funktion zum Entfernen des Listeners zurückgegeben werden (siehe Abschnitt zum Brechen von Änderungen aus dem Änderungsprotokoll für Beta.2). Dies dient dazu, Speicherlecks in großen Anwendungen zu vermeiden (siehe Nr. 6686 ).
Um den Listener zu entfernen, den wir dynamisch hinzugefügt haben, müssen wir listen
oder listenGlobal
eine Variable zuweisen , die die zurückgegebene Funktion enthält, und dann führen wir sie aus.
// 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();
}
Hier ist ein Beispiel mit einem Beispiel. Das Beispiel enthält die Verwendung von listen
und listenGlobal
.
Verwenden von RendererV2 mit Angular 4.0.0-rc.1 + (Renderer2 seit 4.0.0-rc.3)
25/02/2017 : Renderer
wurde veraltet, jetzt sollten wir verwenden RendererV2
(siehe Zeile unten). Siehe das Commit .
10/03/2017 : RendererV2
wurde umbenannt in Renderer2
. Siehe die wichtigsten Änderungen .
RendererV2
hat keine listenGlobal
Funktion mehr für globale Ereignisse (Dokument, Text, Fenster). Es hat nur eine listen
Funktion, die beide Funktionen erfüllt.
Als Referenz kopiere und füge ich den Quellcode der DOM Renderer-Implementierung ein, da er sich möglicherweise ändert (ja, er ist eckig!).
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;
}
Wie Sie sehen können, wird jetzt überprüft, ob eine Zeichenfolge (Dokument, Text oder Fenster) übergeben wird. In diesem Fall wird eine interne addGlobalEventListener
Funktion verwendet. In jedem anderen Fall wird beim Übergeben eines Elements (nativeElement) ein einfaches verwendetaddEventListener
Um den Listener zu entfernen, ist es dasselbe wie Renderer
in Angular 2.x. listen
Gibt eine Funktion zurück und ruft diese Funktion auf.
Beispiel
// 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 mit Angular 4.0.0-rc.1 mit RendererV2
plnkr mit Angular 4.0.0-rc.3 unter Verwendung von Renderer2
host
sie ebenfalls verwendet werden.ngOnDestroy
Code sehen können, beidelisten
undlistenGlobal
eine Funktion zurückgeben, dass beim Aufrufen / Ausführen der Listener entfernt wird. Wie Sie sehen,this.func
wird die von zurückgegebene Funktion gehalten,renderer.listen
und wenn ich diesthis.func()
tue, entferne ich den Listener. Das gilt auch fürlistenGlobal
.Ich finde das auch äußerst verwirrend. Wie @EricMartinez darauf hinweist, gibt Renderer2 listen () die Funktion zum Entfernen des Listeners zurück:
Wenn ich einen Listener hinzufüge
Ich würde erwarten, dass meine Funktion das ausführt, was ich beabsichtigt habe, nicht das Gegenteil, das den Listener entfernt.
In dem gegebenen Szenario wäre es tatsächlich sinnvoller, es so zu benennen:
Es muss einen guten Grund dafür geben, aber meiner Meinung nach ist es sehr irreführend und nicht intuitiv.
quelle
ngOnDestroy
Methode auf. Ich gebe zu, dass es auf den ersten Blick verwirrend erscheinen mag, aber es ist tatsächlich eine sehr nützliche Funktion. Wie sonst nach dir selbst aufräumen?Ich werde ein StackBlitz-Beispiel und einen Kommentar zur Antwort von @tahiche hinzufügen.
Der Rückgabewert ist eine Funktion zum Entfernen des Ereignis-Listeners, nachdem Sie ihn hinzugefügt haben. Es wird empfohlen, Ereignis-Listener zu entfernen, wenn Sie sie nicht mehr benötigen. Sie können diesen Rückgabewert also speichern und in Ihrem aufrufen
ngOnDestroy
Methode .Ich gebe zu, dass es auf den ersten Blick verwirrend erscheinen mag, aber es ist tatsächlich eine sehr nützliche Funktion. Wie sonst können Sie nach sich selbst aufräumen?
Hier finden Sie einen StackBlitz , der zeigt, wie dies beim Klicken auf Ankerelemente funktionieren kann.
Ich habe einen Körper mit einem Bild wie folgt hinzugefügt: um
<img src="x" onerror="alert(1)"></div>
zu zeigen, dass das Desinfektionsmittel seine Arbeit macht.
Hier in dieser Geige finden Sie den gleichen Körper, der an einem befestigt ist,
innerHTML
ohne ihn zu desinfizieren, und er wird das Problem demonstrieren.quelle
Hier ist meine Problemumgehung:
Ich habe eine Bibliothek mit Angular 6 erstellt. Ich habe eine allgemeine Komponente hinzugefügt,
commonlib-header
die in einer externen Anwendung so verwendet wird.Beachten Sie ,
serviceReference
die die Klasse ist (in der Komponente eingespritztconstructor(public serviceReference: MyService)
, die der verwendetcommonlib-header
), die den hältstringFunctionName
Methode:Die Bibliothekskomponente ist so programmiert. Das dynamische Ereignis wird in der
onClick(fn: any)
Methode hinzugefügt :Das wiederverwendbare
header.component.html
:quelle