Backbone.js collection.at(i).get(' person')引用循环中的同一模型

时间:2012-03-01 19:45:52

标签: backbone.js

我有

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创建一个默认模型,其结构相同但没有_idobject的属性为空字符串。

我遇到的问题是在循环之后,所有模型都与data中的最后一个模型具有相同的属性,即name5id5。我在每次迭代中检查obj,它确实是同一个对象。因此,对于每次迭代,集合中的所有模型都设置相同的属性。

每次迭代中的变量name根据data而变化,并且i也会增加。我还将迭代放在一个闭包中,以确保范围是正确的。

为什么Backbone的表现如此?


更新

事实证明,由于null中的response值导致Backbone模型表现得如此奇怪。我重写了集合中的parse函数来设置null对象的默认值,而不是依赖于模型的默认值,它可以工作。

3 个答案:

答案 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 });
        });
    }
});