2016-03-24 8 views
0

listeners growPolymer unlistening nicht richtig

I Polymer.Templatizer verwenden Vorlagen von paper-input Sammlungen in eine custom-element die 'change':'_doStuff' einen Zuhörer hat zu stempeln. Grundsätzlich, wenn ich stempele 20 paper-input s über Polymer.dom(this).appendChild(template.root) eine Reihe von Listenern hinzugefügt werden, wie Sie in der Grafik sehen können. Dann rufe ich eine andere Funktion auf, die alle diese Elemente durchläuft und Polymer.dom(paperInput.parentNode).removeChild(paperInput) ausführt und einen weiteren Satz von Eingängen hinzufügt. Aber es löst nur nicht Listener auf denen aus irgendeinem Grund und der Haufen wächst mit jeder Iteration ... Der Hörer 10 auf dem Host-Element, glaube ich, ist nicht getrennt.

Was mache ich falsch?

EDIT: Ich weiß, was es ist, es ist nicht Garbage Collection-Problem, aber Polymer erstellt anonyme Polymer.Base-Instanzen beim Templatisieren und tatsächlich legt alle Kinder der Vorlage in denen. Natürlich werden die Instanzen in keiner Weise entfernt. Ich wünschte, ich wüsste, wie man diese umbringt, um die Leistung der App nicht zu reduzieren. Indem Sie stattdessen benutzerdefinierte Elemente definieren? Sieht aus wie ein Overhead für mich ...

+0

Chrome gibt den Speicher nicht sofort frei, wenn eine Komponente aus dem DOM entfernt wird. AFAIK nur, wenn Chrome etwas Speicherdruck erfährt, wahrscheinlich auch einige andere Dinge, aber normalerweise nicht sofort sowieso, es läuft Garbage Collection. Wenn die Garbage Collection entfernte Elemente und JS-Objekte entfernt, sollten die Komponenten und Ereignishandler gemeinsam entsorgt werden. Es sollte egal sein, ob die Zuhörer nicht im Voraus entfernt wurden. Wenn Ihr Code einen Verweis auf das Element oder die JS-Objekte enthält, kann GC diese nicht verwerfen. Das ist die Verantwortung Ihres Codes, Referenzen nicht zu behalten. –

+0

Sie könnten einen Fehlerbericht oder eine Feature-Anfrage in https://github.com/Polymer/polymer/ –

+1

bereits erstellt haben –

Antwort

0

Ein Weg, um Ihr Gedächtnis zu befreien, könnte sein, alle Ihre Zuhörer aufzuhören, bevor Sie Ihre Elemente lösen, damit sie zuerst nicht referenziert werden. Beispiel:

for (var i = 0; i < inputList.length; i++) { 
    this.unlisten(inputList[i], 'change', 'doStuff'); 
    Polymer.dom(inputList[i].parentNode).removeChild(inputList[i]); 
} 
Verwandte Themen