2016-03-24 46 views
0

listeners growポリマーは、適切に

私はリスナー'change':'_doStuff'を持ってcustom-elementpaper-inputコレクションのテンプレートをスタンプするPolymer.Templatizerを使用unlisteningありません。 基本的には、私が20 paper-inputのスタンプをPolymer.dom(this).appendChild(template.root)経由で送信すると、グラフでわかるように、リスナーの束が追加されます。 次に、これらの要素をすべて調べて、Polymer.dom(paperInput.parentNode).removeChild(paperInput)を実行し、別の入力を追加する別の関数を呼び出します。しかし、何らかの理由でそれらのリスナーを切り離すことはなく、ヒープはすべての繰り返しで成長しています。 ホスト要素のリスナーchangeは、私は信じられていません、分離されていません。

私は間違って何をしていますか?

編集:私はそれがガベージコレクションの問題ではないことを知っていますが、Polymerはテンプレート作成時に匿名のPolymer.Baseインスタンスを作成し、実際にテンプレートのすべての子をそれらに入れます。もちろんインスタンスは決して削除されません。私は、アプリのパフォーマンスを低下させないようにそれらを殺す方法を知りたがっています。代わりにカスタム要素を定義することによって?私にオーバーヘッドのように見えます...

+0

DOMからコンポーネントを削除すると、Chromeはすぐにメモリを解放しません。 AFAIKはChromeにメモリの負荷がかかり、おそらく他のものもありますが、通常はすぐには使用できません。ガベージコレクションが実行されます。ガベージコレクションで削除された要素とJSオブジェクトが破棄される場合、コンポーネントとイベントハンドラは一緒に処理する必要があります。リスナーが事前に削除されていないかどうかは問題ではありません。コードが要素またはJSオブジェクトへの参照を保持している場合、GCはそれらを破棄できません。それは参照を保持しないようにするコードの責任です。 –

+0

https://github.com/Polymer/polymer/でバグレポートや機能要求を作成することができます –

+1

既に完了しています –

答えて

0

あなたの記憶を解放する方法は、あなたの要素をデタッチする前にすべてのリスナーのリストを解除して、参照を解除することができます。たとえば、次のようになります。

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