使用id获取主干集合中的问题

时间:2013-02-14 11:14:31

标签: javascript jquery backbone.js underscore.js handlebars.js

以下是我的JSON:

[ 
{  
    "id" : "1",
    "type" : "report"
},
{  
    "id" : "2",
    "type" : "report"
},
{  
    "id" : "1",
    "type" : "email"
},
]

考虑一下,json从骨干集合中返回 - >服务电话。 现在,当我使用json响应使用骨干视图和把手模板系统渲染我的html表时。 显示2行,而不是3行。

注意: 集合Parse响应返回正确的json(即3行)。 当我使用具有唯一随机生成数字的集合解析覆盖id时,将显示所有3行。 这不行,因为我不想更改id

我希望该行显示如下:

1 reports
2 reports
1 email

2 个答案:

答案 0 :(得分:2)

来自Collection add的文档,

  

请注意,将相同的模型(具有相同ID的模型)添加到a   不止一次收集是一种无操作。

虽然我看不出为什么两个不同的对象应具有相同ID的原因,但您可能有正当理由。一个建议是在json响应_dummyId中为每个对象添加另一个属性,并将其设置为服务器端的自动增量值。在客户端,在您的模型定义代码中,然后将idAttribute设置为_dummyId

JSON响应,

[ 
{  
    "id" : "1",
    "_dummyId": "1",
    "type" : "report"
},
{  
    "id" : "2",
    "_dummyId": "2",
    "type" : "report"
},
{  
    "id" : "1",
    "_dummyId": "3",
    "type" : "email"
},
]

您的模型定义from http://backbonejs.org/#Model-idAttribute

var Meal = Backbone.Model.extend({
  idAttribute: "_dummyId"
});

那就是说,我希望骨干中有一个优雅的设置,这使得骨干集合成为列表而不是集合。

答案 1 :(得分:1)

如果要解决此问题,则必须为添加到集合的每个模型设置新的唯一ID。 试试这个方法:

initialize: function() {
      this.set("id", this.generateID());
},
generateID = function () {
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
        return v.toString(16);
    });
}

如果您需要原始ID,则需要先保存它,然后在创建新ID之后,将原始设置在另一个模型属性中。 当我将@ amith-george解决方案idAttribute设置为另一个dummyId

时,Backbone忽略了我