これは私の Stackoverflow への最初の質問です。
アプリで Kendo Widgets を多用しています。すべてのウィジェット タイプ ( MyAutocomplete、MyGrid など) にカスタム ラッパーを使用します。すべてのラッパーは、プロキシされた関数をウィジェットのコンストラクターに渡します。
var me=this;
$("#mywidget").kendoAutoComplete({
...
dataTextField: me.dataTextField,
select: $.proxy(me.onSelected, me),
change: $.proxy(me.onChanged, me),
});
ラッパーには、Kendo の「destroy」メソッド、Jquery の「remove」および「off」メソッドなどを呼び出す dispose 関数があります。
アプリを実行すると深刻なメモリ リークが発生します。Chrome Dev Tools の Profiles タブを使用すると、ラッパーを保持するためのコンテキストがプロキシ参照であることがわかります。
proxyjquery.js:775
function () {
return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
}
プロキシを削除し、元のイベント ハンドラを渡すことでこれを確認しました。(大雑把に) 正しく機能していませんが、ラッパーは参照されなくなりました。私が思うのは、.proxy は元の関数 (例: me.onSelected ) のクロージャーであるため、「return fn.apply」は「fn」である「me.onSelected」への参照を保持しています。
質問は次のとおりです。閉鎖の問題について私は正しいですか、もしそうなら-
プロキシされたイベント ハンドラーへの参照をクリアするにはどうすればよいですか?
よろしくお願いします。