【问题标题】:Difference between backbone on/off (teardown) and listenTo/stopListening Implementation主干开/关(拆卸)和listenTo/stopListening实现之间的区别
【发布时间】:2015-04-28 20:04:14
【问题描述】:

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

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

【问题讨论】:

  • @DerickBailey,我知道您是主干内存管理的主题专家 =),因此在此处标记您,希望您能在这里帮助我。提前致谢!

标签: backbone.js bind listen teardown


【解决方案1】:

简短的回答是肯定的,有重叠。

更复杂的答案是 Backbone 0.9.9 中引入的 listenTo/stopListening 方法已经使用了 on/off 方法,但还有一些有用的附加功能——它们将当前事件侦听器存储在称为 _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();
  ...
}

【讨论】:

  • 我想我不明白为什么 Backbone API 将回调作为 Events.stopListening(obj,name,callback) 的第三个参数,有人知道吗?什么时候会触发回调?
  • stopListening 不调用回调,但允许调用者定位在先前调用 listenTo 时传递的特定处理程序,而不是删除特定对象和事件类型的所有处理程序元组。
【解决方案2】:

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

我将要做的,因为我正在将我的应用程序从 0.9.2 升级到 0.9.9(到目前为止它实际上仍然有效),只是将我所有的开关切换到 listenTo 和 stopListening。大多数情况下,我也有关闭方法。但是,我仍然会调用 undelegateEvents,以防万一。知道您仍在摆脱事件侦听并没有什么坏处。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 2014-05-25
    • 1970-01-01
    • 2014-08-01
    • 2020-09-01
    • 2020-08-14
    相关资源
    最近更新 更多