collection.fetch({add:true})如何工作?

时间:2013-04-11 07:29:11

标签: backbone.js fetch

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

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

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

2 个答案:

答案 0 :(得分:14)

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

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

但是,我想进一步扩展该方法的一般行为(它使用Collection#set方法作为回调,因此它更多地是Collection#set'的行为)。 Backbone 准备模型,这意味着它在方法开始时创建假的,易变的模型(如果它们没有被添加,它们只是易变的)。这可能会导致意外行为:因为它创建模型,那些的初始化方法将被执行

另外,作为旁注,自Backbone 1.0以来,如果要在获取时重置集合,则会引入Collection#reset标志(因此它将此方法用作回调)。在此之前,它是Collection#fetch方法的默认行为。

嗯,有了这两个答案你应该得到你需要的所有信息。

答案 1 :(得分:4)

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

  

使用set方法对集合执行“智能”更新   通过了模型列表。如果列表中的模型尚未出现在   收集它将被添加;如果模型已经在集合中   它的属性将被合并;如果集合包含任何   列表中没有的模型,它们将被删除。全部   适当的“添加”,“删除”和“更改”事件都会被触发   发生。如果您想自定义行为,可以禁用它   使用选项:{add:false},{remove:false}或{merge:false}。

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

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

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