Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Backbone.js 在集合上使用重置与添加-为什么它们有如此大的差异?_Backbone.js - Fatal编程技术网

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

Backbone.js 在集合上使用重置与添加-为什么它们有如此大的差异?,backbone.js,Backbone.js,修订问题 collection.reset方法与collection.add方法。两者都将模型列表作为输入。但是,当发出单个“reset”事件时,reset会像这样返回对象 {d, _byCid: Object, _byId: Object, _callbacks: Object, length: 3, models: Array[3], __proto__: x} 但是,add方法返回一个简单的数组,如上面的models:array[n]对象中所示。然后可以很容易地执行类似下面我的示例代码中

修订问题

collection.reset方法与collection.add方法。两者都将模型列表作为输入。但是,当发出单个“reset”事件时,reset会像这样返回对象

{d,
_byCid: Object,
_byId: Object,
_callbacks: Object,
length: 3,
models: Array[3],
__proto__: x}
但是,add方法返回一个简单的数组,如上面的models:array[n]对象中所示。然后可以很容易地执行类似下面我的示例代码中addRender方法中的操作。然而,当尝试做同样的事情时,必须做额外的工作来获取和处理相同的模型列表

需要回答的问题是:为什么这些方法(添加和重置)在执行类似操作时返回两种不同类型的对象?添加,添加模型列表。重置、核化现有集合并将其替换为模型列表。当模型是从添加触发器返回的内容时,从重置触发器返回此有什么用。返回集合对象与仅返回模型有什么好处(请举例说明)

---下面是原始问题---

我正在学习如何使用backbone.js,并一直在尝试收藏。我发现,通过调用foo.add()可以很容易地将许多模型添加到集合中,其中foo是一个集合。但是我发现,执行foo.reset()并不像我期望的那样接受相同的输入。例如,使用新的模型列表或散列重置集合,即使根据backbonejs文档:

每次添加和删除一个模型都很好,但是 有时你有太多的模型要改变,你宁愿 批量更新集合。使用“重置”将集合替换为 新的模型列表(或属性哈希)

这里的关键词是列表。我可以发送一个要添加的模型列表(),效果非常好。但是,要对reset执行相同的操作,需要使用不同的模板来处理该数据,因为发送到该模板的数据不同。我创建了一个JSFIDLE来演示:

我觉得令人沮丧的是,我认为reset()的行为应该与add()完全一样,但它似乎没有这样做,我也找不到一个好的理由来解释为什么它不会这样做。我做错了吗

更新 我相信我已经开始回答我自己的问题了。在backbone.js的源代码中,在reset方法的第745行,您会发现:

if (!options.silent) this.trigger('reset', this, options);
在第631行,您将在add方法中看到:

model.trigger('add', model, this, options);
第一个是reset方法,第二个是add方法。在重置的情况下,“this”被传递,并且它所持有的结构与add传递的结构不同。“添加”将传递单个模型,而“重置”将传递具有指向所有模型数组的属性的对象。这解释了我在JSFIDLE中看到的内容。但我不确定这是否是文档中实际描述的行为。嗯

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

后期编辑

传入的对象是集合本身

如果要对该集合中的模型进行操作,可以使用“通过集合获取模型”。您可以访问集合中的所有内容,如
每个
映射
过滤器
查找

处理重置事件的代码可能如下所示:

resetRender: function(collection) {
  collection.each(function(model){
      this.addRender(model);
  });
  return this;
}
原创

Add
将模型添加到现有模型集合中,保留集合中已有的任何模型<代码>重置使用传递到重置中的模型或对象替换当前模型集,它不会保留集合中的任何现有模型

Add为每个添加的模型触发一个“Add”事件

重置触发整个集合的单个“重置”

他们的存在是为了做完全不同的事情

Reset通常用于使用一组数据大容量加载集合,例如,如果您已使用初始页面加载作为javascript变量交付了一组引导数据,并且希望使用该数据填充集合。重置也用于在获取后填充集合,除非指定了
{add:true}
选项

想象一下用户故事:

给定包含模型a、B、C的集合

我希望集合现在包含模型X、Y、Z

如果不使用重置,则必须(在伪代码中)

使用“重置”,您只需执行以下操作:

collection.reset([X,Y,Z])
第一个触发6个事件,第二个触发1个事件


重置只是执行需要执行的操作的又一个工具。

理解,但从根本上说,我觉得在我上面概述的代码(第631行和第745行)中执行的触发器的行为应该是相同的。我最初的问题是,为什么每个都返回不同类型的对象?通过我后来添加的更新,我最终自己回答了这个问题。例如,add和reset方法都会获取一个模型列表,但其中一个会在触发器中返回一个模型列表(add),另一个(reset)会返回一个对象,比如:{u byCid:object,{u byId:object,{u callbacks:object,length:3,models:Array[3],proto:x}。我不理解将这种对象传递回任何绑定到重置触发器的函数的用处。传回models数组会更有意义,您可以在model属性中看到它。相反,“this”,reset()方法的范围是返回到触发器的内容。或者reset方法中类似的内容将非常有用…如果(!options.silent)this.trigger('reset',this,models,options);因此,如果人们只是想在不做额外工作的情况下在同一个swoop中重新设置和添加所有内容,这将很容易。我也会认为,仅仅在现有的集合上进行pop不会很好。看一下reset方法,您将看到更多的工作在那里完成。从集合返回的对象。reset是集合本身-它的
collection.reset([X,Y,Z])