我目前正在使用骨干来实现我的应用。作为内存管理的一部分,我将在切换视图时触发所有视图的拆解
teardown: ->
for viewName, view of @subViews
view.teardown()
for object, events of @objectEvents
@_handleObjectEvents("off", object, events)
@off()
@remove()
@undelegateEvents()
@
这种方法是否足以确保解决大部分内存问题?我在这里看到的挑战是,我需要跟踪每个视图的所有子视图,并在清理过程中调用所有主视图和子视图的拆解。
我做了一些搜索,发现骨干也有这两个事件:'listenTo'和'stopListening',我们在视图级别控制事件与模型的绑定。
view.listenTo(model, 'change', view.render);
view.stopListening(model);
我的问题是,我的拆解实施和使用'stopListening'之间是否存在重叠?我可以单独使用'stopListening'进行内存管理吗?
答案 0 :(得分:4)
简短的回答是肯定的,有重叠。
更复杂的答案是Backbone 0.9.9中引入的listenTo / stopListening方法已经使用了开/关方法,但有一些有用的补充 - 它们将当前事件监听器存储在名为_listeners的内部对象中。
使用此对象的好处是您始终知道所有侦听器的完整列表 - 您可以迭代它并从中删除特定元素(请记住,侦听器只是一个函数而函数只是一个对象)。
所以,你可以这样称呼它:
this.stopListening(emitting_object, ["reset", "add"]) // Removes listeners for "reset" and "add" on emitting_object
this.stopListening(emitting_object) // Removes all listeners on emitting_object
this.stopListening() // Iterates over _listeners object and removes all listeners (probably the most usable case)
因此,使用此方法,您可以将拆解方法转换为以下内容:
this.teardown = function(){
this.stopListening();
...
}
答案 1 :(得分:3)
我建议使用listenTo方法。它的优点在于,当您在视图上使用remove方法时,它将自动解除绑定(调用stopListening)它正在侦听的内容。根据Derrick Bailey的说法,它还解除了事件属性下的事件。
我会做什么,因为我正在将我的应用程序从0.9.2升级到0.9.9(到目前为止仍然有效),只需切换我的所有ons / offs来listenTo和stopListening。我也大多数都有接近的方法。但是,为了以防万一,我仍然会调用undelegateEvents。知道你还在摆脱聆听事件并不会有害。