主干开/关(拆解)和listenTo / stopListening实现之间的区别

时间:2013-01-15 01:17:22

标签: backbone.js bind listen teardown

我目前正在使用骨干来实现我的应用。作为内存管理的一部分,我将在切换视图时触发所有视图的拆解

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'进行内存管理吗?

2 个答案:

答案 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。知道你还在摆脱聆听事件并不会有害。