我在我的集合中添加了一个模型并执行了model.save数据保存在服务器上。
在此之后我调用collection.fetch({add:true})。理想情况下,只应从服务器返回一个模型,即新添加的模型,但我看到整个集合在chrome开发人员工具中传播回来。
我很困惑。这实际上是如何工作的?
答案 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从服务器请求整个集合,将其与本地(客户端)的内容进行比较。
(我希望我很清楚;))。