修改后的问题
collection.reset 方法与 collection.add 方法。两者都采用模型列表作为输入。但是,当发出单个“重置”事件时,重置会像这样返回对象。
{d,
_byCid: Object,
_byId: Object,
_callbacks: Object,
length: 3,
models: Array[3],
__proto__: x}
但是,add 方法返回一个简单的数组,如上面的 models:Array[n] 对象中所示。然后很容易执行类似于下面示例代码中的 addRender 方法中的操作。然而,当尝试做同样的事情时,必须做额外的工作来获取并处理相同的模型列表。
要回答的问题:为什么这些方法(添加和重置)在执行类似操作时返回两种不同类型的对象?添加,添加型号列表。重置、删除您现有的收藏并将其替换为模型列表。当模型是从添加触发器返回的内容时,从重置触发器返回 this
有什么用处。返回集合对象与仅返回模型有什么好处(请举例)?
---下面的原始问题---
我正在学习如何使用backbone.js,并一直在尝试集合。我发现通过调用 foo.add() 可以很容易地将大量模型添加到集合中,其中 foo 是一个集合。我发现执行 foo.reset() 并不需要与我期望的输入相同的输入。 EG,使用新的模型列表或哈希值重置集合,甚至根据backbonejs文档:
Adding and removing models one at a time is all well and good, but sometimes you have so many models to change that you'd rather just update the collection in bulk. Use reset to replace a collection with a new list of models (or attribute hashes)
这里的关键词是列表。我可以向 add() 发送模型列表,效果很好。但是,要通过重置执行相同的操作,需要使用不同的模板来处理该数据,因为它发送到模板的方式不同。我创建了一个 jsfiddle 来演示:
令我沮丧的是,我认为 reset() 的行为应该与 add() 的行为完全相同,但它似乎并非如此,而且我也想不出它不这样做的充分理由。我这样做错了吗?
更新 我相信我已经开始回答我自己的问题了。在backbone.js的源代码中,在reset方法中的第745行,您会发现:
if (!options.silent) this.trigger('reset', this, options);
在第 631 行,您将在 add 方法中看到这一点:
model.trigger('add', model, this, options);
第一个来自重置方法,第二个来自添加方法。在重置的情况下,“this”被传递,并且它具有与 add 传递的结构不同的结构。 Add 传递单个模型,而 Reset 传递一个对象,该对象具有指向所有模型的数组的属性。这解释了我在 jsfiddle 中看到的内容。但我不确定这是否是文档中实际描述的行为。嗯
最佳答案
不确定您的问题到底是什么。
帖子编辑
传入reset event的对象是集合本身。
如果你想操作该集合中的模型,可以通过collection.models
获取它们。您可以访问所有 underscore-inherited methods在诸如 each
、map
、filter
、find
等集合上。
处理重置事件的代码可能类似于:
resetRender: function(collection) {
collection.each(function(model){
this.addRender(model);
});
return this;
}
原创
Add
将模型添加到现有模型集合中,并保留集合中已有的任何模型。 重置
用传递到重置中的模型或对象替换当前的模型集,它不会保留集合中的任何现有模型。
添加会为添加的每个模型触发“添加”事件。
重置会触发整个集合的一次“重置”。
它们的存在是为了做完全不同的事情。
重置通常用于批量加载包含一组数据的集合 - 例如,如果您已将初始页面加载作为 JavaScript 变量传递了一堆引导数据,并且您希望使用该数据填充集合。 Reset 还用于在获取后填充集合,除非指定了 {add: true}
选项。
想象一下用户故事:
Given a collection that contains models A, B, C.
I want the collection to now contain the models X, Y, Z
不使用重置,您必须(以伪代码)
while collection.length
collection.pop()
collection.add([X,Y,Z])
使用重置,您只需执行以下操作:
collection.reset([X,Y,Z])
第一个触发 6 个事件,第二个触发 1 个事件。
重置只是盒子里的又一个工具,用于完成需要做的事情。
关于backbone.js - 在集合上使用重置与添加 - 为什么它们差异如此之大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10131819/