Backbone.js 主干网开/关(拆卸)和listenTo/stopListening实现之间的区别

Backbone.js 主干网开/关(拆卸)和listenTo/stopListening实现之间的区别,backbone.js,bind,listen,teardown,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()

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

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”之间是否存在重叠?我可以只使用“停止侦听”来管理内存吗?

我建议使用listenTo方法。它的好处在于,当您在视图上使用remove方法时,它将自动解除它正在侦听的内容的绑定(调用stopListening)。根据Derrick Bailey的说法,它还解除了events属性下的事件的绑定


我要做的是,因为我正在将我的应用程序从0.9.2升级到0.9.9(实际上到目前为止仍然有效),只需将所有开/关切换到listenTo并停止监听。我在这方面也有很多方法。不过,为了以防万一,我还是会打电话给Unelegateevents。知道你仍在摆脱事件监听,这并没有什么坏处。

简短的回答是肯定的,存在重叠

更复杂的答案是主干网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();
  ...
}

@DerickBailey,我知道你是主干内存管理的主题专家=),因此在这里给你贴标签,希望你能在这里帮助我。提前谢谢!我想我不明白为什么主干API将回调作为事件的第三个参数?什么时候会触发该回调?
stopListening
不会调用回调,但允许调用方将在上次调用
listenTo
时传递的特定处理程序作为目标,而不是删除特定对象和事件类型元组的所有处理程序。