不明白为什么 Backbone collection.create 不发布数组
Don't understand why Backbone collection.create doesnt POST an array
我正在尝试Backbone,遇到了一些问题。
如果我将 Collection.create 与模型数组一起使用,那么发布到服务器的 JSON 似乎不太容易解析。
例:
var Person = Backbone.Model.extend({
initialize: function() {
this.on( 'all', function(e)
{ console.log( "Person model all " + this.get("name") + ", event: " + e ); }
);
}
});
var People = Backbone.Collection.extend({
initialize: function() {
this.on( 'all', function(e) { console.log( "People collection event: " + e ); } );
},
url: "/models/",
model: Person
});
var people = new People();
people.create( [ { "name":"joe", "age":24 }, { "name":"dan", "age":42 } ] );
然后,我的服务器收到以下 JSON:
{"0":{"name":"joe","age":24},"1":{"name":"dan","age":42}}
这是什么,为什么它不是一个简单的数组,比如:
[{"name":"joe","age":24},{"name":"dan","age":42}]
事实上,它很难解析,因为更糟糕的是,如果你做一个Model.save(),那么你会得到一个没有这些ID值的简单对象(更有效)。
我能够解析这个集合帖子的唯一方法是执行以下操作:
for( var n in payloadobj )
{
var person = new Object();
person.id = parseInt(n, 10);
person.name = payloadobj[n].name;
person.age = payloadobj[n].age;
}
有谁知道为什么会这样,我是否遗漏了什么,我是否要覆盖一些东西只是为了使其更加一致,还是我应该避免 Collection.create?
Backbone 中的集合在内部使用数组,但旨在方便地提供对有序和无序模型的访问。因此,当您添加不带 ID 的 People 实例时,会自动为它们分配一个 cid (clientId) 属性(因为你尚未提供备用 ID)。
但是,在您介绍的情况下,您的代码正在调用 Create
方法,该方法一次只采用一个模型(而不是数组)。因此,它在内部创建了错误的结构。你可以这样做:
var people = new People([{ "name": "joe", "age": 24 }, { "name": "dan", "age": 42}]);
create
方法只是一种方便的方法,它在每个模型(以"c"为前缀)上解析单个模型(并查找cid
/id
)。
因此,如果您编写自己的保存函数,您只需在 people 集合上调用 toJSON
,您将获得所需的内容(Person 对象的数组)。
相关文章:
- 根据Javascript中的字符串值对数组的数组进行排序
- 为什么typeof的数组的数组的未定义值返回为“0”;未定义的“;我的条件不认为是真的
- 如何创建具有单个元素或元素数组的数组
- 在 javascript 中添加数组到数组
- 在 Kineticjs 中删除数组中的组
- 将对象的数组转换为数组
- javascript/jquery从计数数组构建数组
- javascript:更改应用到的数组的数组方法列表
- 按每个数组中的一个值对一组关联数组进行排序
- 从现有数组创建数组
- 按子数组处理数组
- 正在使用另一个数组检查数组中的多个值
- 删除基于另一个数组的数组元素
- 使用JavaScript's Reduce从对象数组创建数组
- 解析json数组到数组javascript
- 从字符串数组创建唯一组合数组
- 如何在Mongoose中从多个数组更新数组内部的值
- 使用包含参数数组的数组调用函数,而不是仅列出数组
- 将对象数组转换为数组
- 为什么我需要用数学.石头剪子布游戏的数组层数