我有
data = {
"name1": "id1"
, "name2": "id2"
, "name3": "id3"
, "name4": "id4"
, "name5": "id5"
}
var MyCollection = Backbone.Collection.extend({
model: Backbone.Model
})
var myCollection = new MyCollection();
myCollection.fetch({
success: function(collection, response) {
var i = 0;
for (var name in data) {
if ( !data.hasOwnProperty( name ) ) continue;
(function(theName) {
var obj = collection.at(i).get('object');
obj.id = data[theName];
obj.displayName = theName;
collection.at(i).set({"object": obj});
})(name);
i++
}
}
})
response
包含
[
null
, {
"_id" : "some id"
, "object": {
"displayName": "name1"
, "id": "id1"
}
}
, null
, {
"_id" : "some id"
, "object": {
"displayName": "name1"
, "id": "id1"
}
}
, null
]
某些null
值是因为它们不存在于数据库中。 fetch上的集合将为null
创建一个默认模型,其结构相同但没有_id
,object
的属性为空字符串。
我遇到的问题是在循环之后,所有模型都与data
中的最后一个模型具有相同的属性,即name5
和id5
。我在每次迭代中检查obj
,它确实是同一个对象。因此,对于每次迭代,集合中的所有模型都设置相同的属性。
每次迭代中的变量name
根据data
而变化,并且i
也会增加。我还将迭代放在一个闭包中,以确保范围是正确的。
为什么Backbone的表现如此?
事实证明,由于null
中的response
值导致Backbone模型表现得如此奇怪。我重写了集合中的parse
函数来设置null
对象的默认值,而不是依赖于模型的默认值,它可以工作。
答案 0 :(得分:0)
我没有详细查看代码,但我有预感。这会有用吗?
myCollection.fetch({
success: function ( collection, response ) {
var i = 0;
for ( var name in data ) {
(function ( theName, j ) {
var obj = collection.at( j ).get( 'object' );
obj.id = data[ theName ];
obj.displayName = theName;
collection.at( j ).set({ object: obj });
}( name, i ));
i += 1;
}
}
});
答案 1 :(得分:0)
这是我的建议:
function assign(obj, name){
obj.id = data[name];
obj.displayName = name
}
for (var name in data) {
var obj = collection.at(i).get('object');
assign(obj, name)
collection.at(i).set({"object": obj});
i++
}
希望它有效,因为我不确定迭代i:D
答案 2 :(得分:0)
好的,让我们再试一次:
myCollection.fetch({
success: function( coll ) {
_.each( _.keys( data ), function ( name, i ) {
var obj = _.extend( coll.at( i ).get( 'object' ), {
id: data[ name ],
displayName: name
});
coll.at( i ).set({ 'object': obj });
});
}
});