我遇到DOM元素被刪除後留在內存中的問題。我已經建立了一個如下所示的例子。注意我正在使用骨幹佈局管理器插件來管理我的視圖(以及jQuery)。使用主幹從DOM刪除項目時的內存泄漏
我已經做了在Chrome堆快照之前和刪除列表中的項目之一後,並比較了兩種:
正如你所看到的LI元素仍然是在內存中。
當刪除視圖時,骨幹佈局管理器會調用view.unbind()和view.stopListening()。
下面是示例代碼。
ListOfViewsToDelete.js
var TestModel = Backbone.Model.extend({
});
var TestCollection = Backbone.Collection.extend({
model: TestModel,
});
var ViewToDelete = Backbone.View.extend({
template: "ViewToDelete",
tagName: "li",
events: {
"click .delete-button": "deleteItem"
},
deleteItem: function() {
this.$el.trigger('remove-item', [this.model.id]);
}
});
var ListOfViewsToDelete = Backbone.View.extend({
template: "ListOfViewsToDelete",
initialize: function() {
this.collection = new TestCollection();
for (var i = 0; i < 5; i++) {
this.collection.add(new TestModel({id: i}));
}
this.listenTo(this.collection, 'all', this.render);
},
events: {
"remove-item": "removeItemFromCollection"
},
beforeRender: function() {
this.collection.each(function(testModel) {
this.insertView("ul", new ViewToDelete({
model: testModel
}));
}, this);
},
removeItemFromCollection: function(event, model) {
this.collection.remove(model);
}
});
router.js
app.useLayout("MainLayout").setViews({
"#main": new ListOfViewsToDelete()
}).render();
ListOfViewsToDelete.html
<ul>
</ul>
ViewToDelete.html
View to delete
<button class="delete-button">x</button>
謝謝,我在這裏發佈了一個示例:http://jsfiddle.net/KzVAA/2/當我在刪除項目前後拍攝快照時,我看到HTMLLIElement存儲在內存中。我相信我已經更新了代碼以使用您的建議。 – DownChapel 2013-03-27 09:13:49
謝謝,我會更新我的答案。 – 2013-03-27 10:45:06
太好了,謝謝你的解釋!我會仔細看看嘶嘶聲。 – DownChapel 2013-03-27 12:24:16