backbone.js:调用collection.reset()也会删除模型吗?

时间:2011-10-24 10:35:31

标签: backbone.js

我在骨干文档中读到调用collection.reset()清除集合。我想知道它是否也会移除模型,还是继续存在于内存中?

如果没有删除它们,是否有更简单的方法可以删除集合中的所有模型而无需迭代模型并调用model.remove()

2 个答案:

答案 0 :(得分:3)

您可以从模型中侦听reset事件并进行清理,然后this.destroy()作为回应。这就是事件挂钩的用途。见http://backbonejs.org/#Events-catalog

注意:绝对不应更改或覆盖任何以下划线为前缀的方法或属性,例如_removeReference。下划线表示它旨在作为内部方法或属性,并且内部实现可能会更改(它们的API被认为是不稳定的)。升级Backbone可能会破坏依赖于下划线前缀方法的任何代码,即使该版本被宣传为向后兼容的更改。

我知道你的问题是“没有迭代”,但它确实是最可靠的处理方法。考虑一个模型已从一个集合移动到另一个集合的情况,但它仍然在监听第一个集合的reset事件(因为程序员六个月后没有注意到该连接)。

现在,当第一个集合重置时,移动的模型将被销毁。糟糕!

如果您的API上没有端点会在API服务器上批量删除集合中的所有对象(这通常是如何处理的),则迭代集合可能是处理此问题的最佳方法。

幸运的是,迭代非常简单:

destroyAll: function () {
  var promises = [];

  while(this.models.length > 0) {
    promises.push( this.models[0].destroy() );
  }

  // handle errors communicating with the server
  $.when(promises).fail(function (response) {
    this.trigger('syncError',
      response);
  }.bind(this));
}

答案 1 :(得分:2)

您正在寻找的可能是模型被垃圾收集。也就是说,在将这些模型从集合中移除后,没有人再引用这些模型。

当Backbone从集合中删除时,它会删除它在模型上设置的引用。但是,如果您的代码引用了这些模型,则必须自行清理。大多数情况下,如果这些模型被注册为事件监听器,就会发生这种情况,例如:http://jsfiddle.net/dira/4uxp4/2/

看一下the implementation of reset,您可以更改_removeReference以在模型上调用清理功能。在模型中,从所有侦听器/所有其他对象中删除模型。