2016-07-21 22 views
1

Von den Polymer documentation über Event-Listener:Warum Event-Listener jemals löschen?

Verwenden Sie die automatische Knoten zu finden und die Bequemlichkeit Methoden hören und> UNLISTEN.

this.listen(this.$.myButton, 'tap', 'onTap'); 
this.unlisten(this.$.myButton, 'tap', 'onTap'); 
The listener callbacks are invoked with this set to the element instance. 

Wenn Sie einen Zuhörer unbedingt hinzufügen, müssen Sie es unbedingt entfernen. Dies geschieht üblicherweise in den angehängten und getrennten Callbacks. Wenn Sie das Listener-Objekt oder die Listener mit Listenereignis verwenden, fügt Polymer die Ereignislistener automatisch hinzu und entfernt sie.

Fragen:

  • Warum ist es wichtig, erst nach attached(), an Veranstaltungen der Elemente in dem lokalen DOM hören sie dann zu entfernen, wenn detached()?

  • Werden Ereignis-Listener nicht automatisch gelöscht, wenn das beobachtete DOM-Objekt zerstört wird?

  • Würde dies auch dann gelten, wenn Sie Ereignisse für Elemente in Ihrem hellen DOM hören?

Antwort

2

Polymer entfernt nur Ereignis-Listener, die es selbst hinzugefügt hat. Wenn Sie Ereignislistener selbst hinzufügen (unbedingt), müssen Sie sie selbst entfernen. Code ist möglicherweise nicht in der Lage, Garbage Collection zu erfassen, wenn Ereignis-Listener auf Code verweisen.

+0

"Code ist möglicherweise nicht in der Lage, Garbage Collection zu sammeln, wenn Ereignis-Listener auf Code verweisen" - Was ist, wenn der Code Garbage Collected ist, da das DOM-Element gelöscht wird? – Merc

+0

Das Entfernen des Elements aus dem DOM steht nicht im Zusammenhang mit GC. Wenn auf das Element von irgendwo anders im Code verwiesen wird, spielt es keine Rolle, ob es aktuell zum DOM hinzugefügt wird oder nicht. Wenn das Element ohne Referenzen von oder zu ihm eigenständig ist, dann kann das Entfernen von Ereignis-Listenern überflüssig sein, aber als @Whothehellist, das "besser sicher als Nachsicht" sagt. Es empfiehlt sich immer, alle Ressourcen freizugeben, die Sie angefordert haben. –

2

Grundsätzlich ist es nur beste Praxis. Bei älteren Browsern werden alte Ereignisse nicht ordnungsgemäß entfernt. Wenn Funktionen Bereichsreferenzen enthalten, können sie Speicherlecks verursachen. Ich denke, es ist eine Konvention nach dem Motto "Vorbeugen ist besser".

+0

Ich stimme nicht zu, es ist nicht nur eine Frage der Konvention. Wenn Sie in der neuesten Version des Chrome-Ereignisses testen, wird der Ereignis-Listener nicht entfernt. Daher wird der Handler jedes Mal aufgerufen, es sei denn, Sie entfernen den Listener. Das kann leicht zu Problemen führen – TheeBen