jquery-ui Tabsを使用していますが、タブが削除されたときに問題が発生します。タブはコンテンツ div とともに削除されているように見えますが、(タブが削除された後に) Chrome DevTools プロファイルのヒープを見ると、タブの li 要素と div 要素がまだ存在していることがわかりますが、分離されています。 . 時間が経つにつれて、タブの追加/削除が繰り返されると、これらの要素が蓄積されます。たとえば、タブを 10 回追加すると、10 個の切り離された div 要素と 10 個の切り離された li 要素がヒープ スナップショットに表示されます。
私は次の見解を持っています:
TabLabel = Marionette.ItemView.extend({
template: "#tab-label",
tagName: "li",
events: {
"click .ui-icon-close": "closeTab"
},
closeTab: function(e) {
this.$el.contents().remove();
this.model.collection.remove(this.model);
$("#main-container").tabs("refresh");
this.close();
}
});
TabContainer = Marionette.ItemView.extend({
template: "#tab-container",
tagName: "div",
onBeforeRender: function() {
this.$el.attr("id", "div-" + this.id);
},
onClose: function() {
// This removes the region that contains the container
App.layout.removeRegion(this.containerRegion);
}
});
TabLabels = Marionette.CollectionView.extend({
tagName: "ul"
});
TabContainers = Marionette.CollectionView.extend({
tagName: "div"
});
ビューは次のようにインスタンス化されます。
tabs = new TabsCollection(); // Create a new collection instance
var tabLabelView = new TabLabels({
itemView: TabLabel,
collection: tabs
});
var tabContainerView = new TabContainers({
itemView: TabContainer,
collection: tabs
});
ご覧のとおり、両方のビューが同じコレクションを参照しています。コレクション内の各モデルは、単一のタブを表していると言えます (たまたま、モデルには jquery-ui タブを満たすために必要な情報が含まれています)。ビューは Marionette.Layout を介して領域に表示されます...かなり標準的です。タブを追加するには、タブ コンテナー内のリンクをクリックします。これは、別のモデルをコレクションに追加し、メイン コンテナーで tabs("refresh") を呼び出すだけで、新しいタブが表示されます。タブを削除するには、タブの右上隅にある「X」アイコンをクリックします。
このリークを追跡するために多くの時間を費やしましたが、それが私のコードの問題なのか (おそらくビュー/モデル/などを閉じる方法に問題があるのか?)、それともjquery-ui タブ プラグイン。
考え?前もって感謝します!
更新 #1要求に応じて、問題を示すjsfiddleを次に示します。タブを閉じるだけで、切り離された要素が取り残されていることがわかります。
また、スクリーンショット:
更新 #2これは、jquery-ui タブ ウィジェットのリークのようです。jquery-ui Web サイトのウィジェットのデモでも同じ動作が発生します。いくつかのタブを追加してからそれらを閉じましたが、確かに、それらは持続しました:
これは、jQuery UI の最新 (この記事の執筆時点) バージョン (1.10.3) と以前のバージョン (1.10.2) でテストしました。