backbone.js - 在集合上使用重置与添加 - 为什么它们差异如此之大?

标签 backbone.js

修改后的问题

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

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

令我沮丧的是,我认为 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在诸如 eachmapfilterfind 等集合上。

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

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/

相关文章:

javascript - Backbone.js 如何连接 View 和 Model

javascript - 绑定(bind)到由 collection.create() 创建的模型的错误事件?

jquery - 不透明度 0.5 除了这个 dd

javascript - Backbone.extend 函数究竟是如何工作的?

javascript - 嵌套在 firebase 集合模型中的集合没有添加功能

javascript - Backbone DELETE 发送时主体为空

javascript - 多个 View 中出现 Backbone.js 验证错误

javascript - 无法在简单的node.js应用程序中找到模块mongodb

javascript - 如何将数组转换为 Backbone 中的集合

javascript - 如何中止 RequireJS 'require' 请求?