【发布时间】:2013-08-05 00:33:59
【问题描述】:
我在解决主干内存泄漏方面遇到问题,到目前为止,当视图从 DOM 中删除时,我尝试使用 jquery CleanData 清理视图。
每次删除视图时(即使是通过 jQuery .html()),它都会触发 dispose() 方法,理论上该方法应该终止所有阻止收集视图的引用。不幸的是,该应用程序只是建立了内存
代码如下,
Backbone.View.prototype.dispose = function(){
// unbind all events, so we don't have references to child views
this.unbind();
this.off();
// if we have a collection - unbind all events bound to this context
this.collection && this.collection.off(null, null, this);
// do the same with a model
this.model && this.model.off(null, null, this);
delete this;
};
干净的数据:
$.cleanData = function( elems ) {
$.each( elems, function( i, elem ) {
if ( elem ) {
$(elem).trigger("dispose");
}
});
oldClean(elems);
};
代码工作,dispose 被命中(我在视图中添加了事件)但是当我改变页面时它从来没有被收集。
(关于 dispose 事件..) 我没有在所有视图上明确调用删除。应用程序容器被清空,jQuery 执行 cleanData。我添加了一个事件处理并在 cleandata 中触发了该函数
【问题讨论】:
-
我对您似乎删除绑定的方式感到困惑。
$(elem).trigger("dispose");是一个 jQuery 选择器,您应该清理 Backbone 视图。那么为什么不直接在视图内调用this.dispose() -
因为我没有在所有视图上明确调用 remove 。容器被清空,jQuery 执行 cleanData,我添加了一个调用此函数的事件处理
-
您是否看过 Marionette,它扩展了 Backbone.js 的功能。 Marionette 似乎在保持 Backbone 干净且没有内存泄漏方面做得很好。
-
您必须在所有视图上显式调用
dispose。在 DOM 上触发dispose将不会调用视图中的方法。如果您不想这样做,请考虑使用像 Marionette 这样的扩展程序,它会自动为您关闭并清理所有子视图。
标签: javascript jquery backbone.js