我在Backbone应用程序上工作,它使用了很多视图。我陷入了(通常我认为)实例化路由器(一种类型,主控制器)的陷阱,它负责清除视图,实例化新视图,并用数据填充它们。我说陷阱,因为虽然JavaScript有一个内置的垃圾收集器,但很快就会注意到应用程序的可用性如何被许多未使用的视图所阻碍,这些视图仍然存在于内存中。
我希望有办法回收这些观点。我认为这就像使用新模型在视图上调用initialize()一样简单,然后重新渲染。遗憾的是,这并不容易。
另外,人们不得不“破坏”视图句柄,例如,事件处理程序和东西......
这样做有什么好处?
答案 0 :(得分:3)
从DOM
移除视图后,它将被垃圾回收。除非您当然缓存它。如果您确实缓存了一个视图并将其从DOM
中删除,那么所有事件处理程序也会被垃圾收集。除非你使用类似jQuery的detach
方法,它将保留事件处理程序。
如果要回收视图,只需将其缓存在变量中即可。
在router
的init方法中,执行以下操作:
this.views = {};
然后,每当调用路由时,检查缓存中是否有可用的视图名称,如果是,请使用它,否则创建一个新的。
someRoute: function () {
var view;
if ( _.has(this.views, 'someRouteView') ) {
view = this.views.someRouteView;
} else {
view = new SomeRouteView;
this.views.someRouteView = view;
}
// You have a view now
}
同样,如果您不创建新视图,则必须使用类似jQuery的detach
方法来保留事件处理。