我正在尝试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?
答案 0 :(得分:1)
Backbone中的集合在内部使用数组,但旨在方便地提供对有序和无序模型的访问。因此,当您添加没有ID的People实例时,会自动为它们分配cid(clientId)属性(因为您没有提供替代ID)。
但是,在您出现的情况下,您的代码正在调用Create
方法,该方法一次只能使用一个模型(不是数组)。所以,它在内部创建了错误的结构。你可以这样做:
var people = new People([{ "name": "joe", "age": 24 }, { "name": "dan", "age": 42}]);
create
方法只是一种方便的方法,可以在每个模型上解析单个模型(并查找cid
/ id
)(前缀为'c')。< / p>
因此,如果您编写自己的保存功能,则只需在人员集合上调用toJSON
即可获得所需内容(Person对象数组)。