修订问题
collection.reset方法与collection.add方法。两者都将模型列表作为输入。但是,当单个"重置"事件被发出。
{d,
_byCid: Object,
_byId: Object,
_callbacks: Object,
length: 3,
models: Array[3],
__proto__: x}
然而,add方法返回一个简单的数组,如上图所示:Array [n] object。在下面的示例代码中,您可以轻松地执行类似于在addRender方法中看到的内容。但是,在尝试执行相同操作时,必须完成额外的工作才能获得并处理相同的模型列表。
要回答的问题:为什么这些方法(添加和重置)在执行类似的操作时会返回两种不同的对象?添加,添加模型列表。重置,核实现有集合并将其替换为模型列表。当模型是从add触发器返回的内容时,从重置触发器返回this
有什么用处。有什么好处(请举一个例子)返回集合对象而不仅仅是模型?
---以下原始问题---
我正在学习如何使用backbone.js并一直在试验集合。我发现通过调用foo.add()可以很容易地将大量模型添加到集合中,其中foo是一个集合。我发现虽然做foo.reset()并没有像我期望的那样采取相同的输入。 EG,使用新的模型列表或哈希重置集合,即使根据backbonejs文档:
一次添加和删除模型一切都很好,但是 有时你会有很多模型可以改变你而不仅仅是 批量更新集合。使用reset替换集合 一个新的模型列表(或属性哈希值)
关键词是列表。我可以发送一个模型列表add(),它很棒。但是,要使用reset执行相同的操作,请使用不同的模板来处理该数据,因为它会与模板发送不同的内容。我创建了一个jsfiddle来演示:
我觉得令人沮丧的是,我认为reset()的行为应该与add()的行为完全相同,但它似乎并不存在,而且我无法想到它为什么不会这样做的好理由。吨。我是不是错了?
更新 我相信我已经开始回答我自己的问题了。在backbone.js的源代码中,在重置方法的第745行,您将找到:
if (!options.silent) this.trigger('reset', this, options);
在第631行,你会在add方法中看到这个:
model.trigger('add', model, this, options);
这首先来自reset方法,第二个是来自add方法。在重置的情况下,"这个"传递并且它具有与添加传递不同的结构。添加传递单个模型,而重置传递一个对象,该对象具有指向所有模型的数组的属性。这解释了我在jsfiddle中看到的内容。我不确定这是文档中实际描述的行为。嗯
答案 0 :(得分:2)
不确定你的问题究竟是什么。
发布修改
reset event中传递的对象是Collection本身。
如果您想对该集合中的模型进行操作,您可以使用collection.models
来获取它们。您可以访问each
,map
,filter
,find
等集合上的所有underscore-inherited methods。
处理重置事件的代码可能如下所示:
resetRender: function(collection) {
collection.each(function(model){
this.addRender(model);
});
return this;
}
<强>原始强>
Add
将模型添加到现有模型集合中,保留集合中已有的任何模型。 Reset
使用传递给重置的模型或对象替换当前模型集,但它不会保留集合中的任何现有模型。
为每个添加的模型添加触发器“添加”事件。
重置会触发整个设置的单个“重置”。
他们存在完全不同的事情。
重置通常用于使用一组数据批量加载集合 - 例如,如果您将初始页面加载作为javascript变量传递了一堆引导数据,并且您希望使用该数据填充集合。除非指定了{add: true}
选项,否则还会在获取后使用重置来填充集合。
想象一下用户故事:
给定一个包含模型A,B,C的集合。
我希望该集合现在包含模型X,Y,Z
不使用重置,你必须(在伪代码中)
while collection.length
collection.pop()
collection.add([X,Y,Z])
使用重置,您只需执行:
collection.reset([X,Y,Z])
第一个触发6个事件,第二个触发1个事件。
重置只是框中的另一个工具,用于执行需要做的事情。