Backbone.js 安全地删除和销毁主干对象

Backbone.js 安全地删除和销毁主干对象,backbone.js,collections,model,reset,destroy,Backbone.js,Collections,Model,Reset,Destroy,我正在构建一个SPA,并试图找到一种安全、干净的方法,在离开应用程序的一个部分时删除所有主干实体。我知道Model.destroy()、View.remove()和Collection.reset()方法。我主要关注的是: Model.destroy()负责在服务器上销毁模型。是否仍然需要手动删除Javascript模型 类似地,我意识到View.remove()将从DOM中删除视图。如何安全地摆脱视图对象 reset()清除集合中的模型。这还会删除底层Javascript模型对象吗,还是需要

我正在构建一个SPA,并试图找到一种安全、干净的方法,在离开应用程序的一个部分时删除所有主干实体。我知道Model.destroy()、View.remove()和Collection.reset()方法。我主要关注的是:

  • Model.destroy()负责在服务器上销毁模型。是否仍然需要手动删除Javascript模型
  • 类似地,我意识到View.remove()将从DOM中删除视图。如何安全地摆脱视图对象
  • reset()清除集合中的模型。这还会删除底层Javascript模型对象吗,还是需要显式删除它们
  • 如何摆脱集合对象本身
我的问题对一些人来说可能很简单,但它们让我困惑了一段时间。我还没有找到任何关于这个问题的有用信息,这就是我决定在这里发帖的原因。我也是Javascript的新手,不知道Javascript的垃圾收集方案。Javascript有垃圾收集器吗?它会删除所有这样的对象吗

我也在研究如何最好地删除视图

  • View.remove()仅从DOM中删除视图。我的猜测是,仍然需要删除/销毁底层模型并解除所有事件侦听器的绑定。对吗
  • 我经常使用u.bindAll来更改函数调用的上下文。我还没有找到解开这捆衣服的方法。我的理解是,这是不必要的。我说得对吗

这里有一个学习javascript中垃圾收集的好资源:

总而言之,主干网唯一需要担心的是删除视图中的自定义事件处理程序,一种常见的方法是重写
remove
并在调用
Backbone.view.prototype.remove
之前删除处理程序。如果正在使用视图的
events
属性,则不需要手动删除在该属性中声明的事件

更具体一些,让我们依次考虑你要问的三种对象。如果您正在使用主干路由器,那么您可能正在路由器方法中创建一个视图对象,可能将其分配给一个var,然后在页面的某个位置设置html。当用户离开时,将调用另一个路由器方法,并且无法访问您创建的对此视图的引用。假设您没有将其创建为窗口或根级别对象或类似对象上的属性,它将被垃圾收集

remove方法是关于从DOM中删除视图。垃圾收集器负责从内存中删除视图。remove方法是一个方便的地方,可以放置在将视图从页面上移除之前需要运行的任何清理代码,因此在此处取消钩住自定义事件处理程序

类似地,
model.destroy
不是销毁存储在内存中的模型对象,而是向服务器发送AJAX删除请求。模型对象和其他对象一样被垃圾收集,一旦无法访问,它们就会消失。如果视图中只包含对模型的引用,则删除该视图将导致对模型进行垃圾收集。收藏也是如此

最后一点,下划线绑定不会成为问题。它是关于绑定上下文(调用函数时使用的
this
的值),而不是关于绑定事件处理程序。像往常一样删除这些事件处理程序

Model.destroy()负责在服务器上销毁模型。是否仍然需要手动删除Javascript模型

,您仍然需要手动删除模型
Model.destroy()
不会删除它

类似地,我意识到View.remove()将从DOM中删除视图。如何安全地摆脱视图对象

删除对它的所有引用。如果没有任何东西指向您的对象,它将被垃圾收集。一般来说,除非您特意确保对对象的引用保持活动状态(例如全局变量)或不小心,否则应该可以

请注意,在您的视图上使用而不是使用会使您的生活更轻松。当我们使用
.on()
时,视图内存泄漏曾经是一个大问题(有关更多信息,请参阅)

reset()清除集合中的模型。这还会删除底层Javascript模型对象吗,还是需要显式删除它们

如何摆脱集合对象本身

Javascript有垃圾收集器吗?它会删除所有这样的对象吗? 只要没有对对象的剩余引用,它们就会被垃圾回收

我已经描述了这方面的鸟瞰图(确保不再引用对象!),但这是一篇关于主干上下文中的垃圾收集的非常好的文章

View.remove()仅从DOM中删除视图。我的猜测是,仍然需要删除/销毁底层模型并解除所有事件侦听器的绑定。对吗

请注意,如果在视图中使用
.listenTo()
,将解除侦听器的绑定。您不需要删除/销毁底层模型,让它得到GC'd,只要没有对它的剩余引用。对模型使用
.listenTo()
是对模型的引用,但如果使用
.remove()
则会删除该引用的视图

我经常使用u.bindAll来更改函数调用的上下文。我还没有找到解开这捆衣服的方法。我的理解是,这是不必要的。我说得对吗

我不清楚通过“解开束缚”你会试图达到什么目的,所以我想说这不是