修改后的问题
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,使用新的模型列表或哈希重置集合,即使根据主干js文档:
一次添加和删除一个模型很好,但有时您有太多模型要更改,您宁愿只批量更新集合。使用 reset 将集合替换为新的模型列表(或属性哈希)
那里的关键词是列表。我可以将模型列表发送到 add() 并且效果很好。但是,要使用重置做同样的事情,需要使用不同的模板来处理该数据,因为它与模板不同。我创建了一个 jsfiddle 来演示:
令我沮丧的是,我认为 reset() 的行为应该与 add() 完全一样,但似乎并非如此,而且我想不出一个很好的理由。我要解决这个问题了吗?
更新 我相信我已经开始回答我自己的问题了。在主干.js 的源代码中,在 reset 方法的第 745 行,您会发现:
if (!options.silent) this.trigger('reset', this, options);
在第 631 行,您将在 add 方法中看到:
model.trigger('add', model, this, options);
这第一个来自 reset 方法,第二个来自 add 方法。在重置的情况下,“this”被传递,它与 add 传递的结构不同。Add 传递单个模型,而 reset 传递一个对象,该对象具有指向所有模型数组的属性。这解释了我在 jsfiddle 中看到的内容。我不确定这是文档中实际描述的行为。唔