2

修改后的问题

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 来演示:

http://jsfiddle.net/pLytF/2/

令我沮丧的是,我认为 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 中看到的内容。我不确定这是文档中实际描述的行为。唔

4

1 回答 1

2

不确定你的问题到底是什么。

发布编辑

在重置事件中传递的对象是集合本身。

如果要对该集合中的模型进行操作,可以使用 get them through collection.models。您可以访问Collection 上的所有下划线继承方法each,例如, map, filter, find

您处理重置事件的代码可能类似于:

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 个。

重置只是盒子中的另一种工具,用于做需要做的事情。

于 2012-04-13T00:48:31.097 回答