6

我在我的集​​合中添加了一个模型并做了 model.save 数据保存在服务器上。

在此之后,我调用 collection.fetch({add:true})。理想情况下,服务器应该只返回一个模型,即新添加的模型,但我看到整个集合都在 chrome 开发人员工具中传播回来。

我很困惑。这实际上是如何工作的?

4

2 回答 2

14

作为 Cyril N. 答案的附加内容(它基本上描述了默认行为,我猜应该足够了),我想更彻底地解释 3 个标志的作用:

  • add: Backbone 是否应该创建尚不存在的模型并将其添加到集合中(即,其 id 不在集合中)
  • remove: Backbone 是否应该从集合中删除没有从服务器带回的模型(即,其 id 不是带回的数据)
  • merge: Backbone 是否应该更新不在前两个类别中的模型(已经在集合中,并从服务器带回来)

但是,我想进一步扩展该方法的一般行为(它使用该Collection#set方法作为回调,所以它更像是Collection#set的行为)。Backbone准备模型,这意味着它会在方法开始时创建虚假的、易失的模型(如果不添加它们,它们只会是易失的)。这可能会导致意想不到的行为:因为它创建了模型,所以执行了这些模型的初始化方法。

另外,作为旁注,从 Backbone 1.0 开始,Collection#reset如果您想在获取时重置您的集合,则引入了该标志(因此它使用此方法作为回调)。在此之前,这是该Collection#fetch方法的默认行为。

好吧,有了这两个答案,我猜你应该有你需要的所有信息。

于 2013-04-11T08:33:04.613 回答
4

当您调用 时collection.fetch({add:true},Backbone 将使用集合中项目的完整列表向服务器请求(因此您在 Chrome 开发人员工具中看到的整个集合),但随后,而不是在 Backbone 中的集合对象中重新加载整个集合(Javascript) , Backbone 将对集合执行“智能”更新

set 方法使用传递的模型列表对集合执行“智能”更新。如果列表中的模型尚未在集合中,它将被添加;如果模型已经在集合中,它的属性将被合并;如果集合包含列表中不存在的任何模型,它们将被删除。发生这种情况时,所有适当的“添加”、“删除”和“更改”事件都会被触发。如果您想自定义行为,可以使用以下选项禁用它:{add: false}、{remove: false} 或 {merge: false}。

来源:http ://backbonejs.org/#Collection-set

所有的智能工作都是在客户端,在 Javascript 中完成的,但为此,Backbone 从服务器请求整个集合,以将其与本地(客户端)中的集合进行比较。

(我希望我很清楚;))。

于 2013-04-11T08:03:59.287 回答