为什么collection.reset的工作方式与collection.add类似?

时间:2013-01-07 09:34:50

标签: backbone.js backbone-views signalr-hub backbone-collections backbone.signalr

我有一个Backbone集合的视图。当我通过backbone.signalR hub重置集合时,我希望得到一个新的集合,我通过我的集线器,但它只是重置集合,然后像调用collection.add一样传递给它。所以我在我的集​​合中的模型中获得了12个属性,其中前6个为空值,最后6个为当前值。

我的收藏包含6个属性的模型。我想用新的6个值重置它们的值。但我无法通过collection.reset()

在重置我的集合之前,我有一个对象包含以下6个属性:

  customerId: 2, 
  expectedTimeOfService: "10 min",
  id: 6,
  noOfWaiting: 13, 
  queueName: "Cash Deposit",
  smsCode: "1234",

重置我的集合后,我得到一个包含以下12个属性的对象:

  CustomerId: null,
  ExpectedTimeOfService: null,
  Id: null,
  NoOfWaiting: null,
  QueueName: null,
  SmsCode: null,
  customerId: 2,
  expectedTimeOfService: "10 min",
  id: 6,
  noOfWaiting: 13,
  queueName: "Cash Deposit",
  smsCode: "1234",

所以,我无法解决问题所在,或者我如何摆脱这个问题。所有我想在收集重置后获得具有更新值的6属性值。

1 个答案:

答案 0 :(得分:1)

JavaScript区分大小写,因此CustomerIdcustomerId不同。当Backbone更新模型时,它找不到匹配的属性,因此它会创建一个新属性。

您应该在源代码中修复问题,并将服务返回的JSON密钥更改为lowerCamelCase

如果您因某些原因无法更改服务响应,则可以在Model.parse中修改转化:

var Model = Backbone.Model.extend({
  parse: function (attrs) {
    var cleaned = {}
    _.each(attrs, function(val, key) {
      cleaned[key[0].toLowerCase() + key.slice(1)] = val;
    });
    return cleaned;
  }
});

重置时传递选项parse:true

collection.reset(data, {parse:true});