backbone.js - 安全地移除和销毁 Backbone 对象

标签 backbone.js collections model reset destroy

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

  • Model.destroy() 负责销毁服务器上的模型。还需要手动删除Javascript模型吗?
  • 类似地,我意识到 View.remove() 将从 DOM 中删除 View 。应该如何安全地删除 View 对象?
  • Collection.reset() 清除集合中的模型。这是否也会删除底层 Javascript 模型对象,或者是否需要显式删除它们?
  • 如何摆脱集合对象本身?

我的问题对某些人来说可能看起来很简单,但它们已经让我困惑了一段时间。我还没有找到关于这个确切问题的任何有用信息,这就是我决定在这里发帖的原因。我对 Javascript 也比较陌生,并且不知道 Javascript 的垃圾收集方案。 Javascript 是否有垃圾收集器并且它会负责删除所有此类对象吗?

我也在研究了解删除 View 的最佳方法。

  • View.remove() 仅从 DOM 中删除 View 。我的猜测是,人们仍然需要负责删除/销毁底层模型并解除所有事件监听器的绑定(bind)。这是正确的吗?
  • 我经常使用 _.bindAll 来更改函数调用的上下文。我还没有找到解除此绑定(bind)的方法。我的理解是这是不必要的。我说得对吗?

最佳答案

这里是学习 JavaScript 垃圾收集的好资源:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Memory_Management

总而言之,使用 Backbone 时您唯一需要担心的是删除 View 中的自定义事件处理程序,而实现此目的的常见方法是覆盖 remove并在调用 Backbone.View.prototype.remove 之前删除处理程序。您无需手动删除在 events 中声明的事件 View 的属性(如果您正在使用它)。

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

remove 方法用于从 DOM 中删除 View 。垃圾收集器负责从内存中删除 View 。在将 View 从页面上移除之前,remove 方法是放置您需要运行的任何清理代码的方便位置,因此请在此处取消 Hook 您的自定义事件处理程序。

同样,model.destroy不是要销毁存储在内存中的模型对象,而是要向服务器发送 AJAX DELETE 请求。模型对象像其他所有对象一样被垃圾收集,并且一旦无法访问就会消失。如果对模型的唯一引用包含在 View 中,则删除该 View 将导致模型被垃圾收集。收藏也是如此。

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

关于backbone.js - 安全地移除和销毁 Backbone 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29931031/

相关文章:

c# - 用于快速插入/删除的 .net 集合

javascript - 如何访问backbone.js中的特定 View ?

javascript - jquery mobile 移动返回过渡?

javascript - 在 Backbone.js 中处理 View 和模型对象

javascript - 检查元素如何获得焦点

android - Protobuf 流式处理(惰性序列化)API

java - 基于其他一些列表属性集合从 List<X> 中提取对象

java - 将 List<Foo> 重构为 FooList

machine-learning - 如何评估平均倒数排名(mrr)是一个很好的模型

php - Illuminate\Database\Eloquent\Builder 类的对象无法转换为字符串