2013-06-03 126 views
10

我在Backbone中包含照片和相册的合并集合。Backbone.js:包含多个具有相同ID的模型的集合

为了区分它们,我添加了一个字段type,它是photoalbum。当我填充集合,我创建了Collection#model方法中的不同型号

model: (attrs, options) -> 
    switch attrs.type 
     when 'album' then new App.Models.Album(attrs, options) 
     when 'photo' then new App.Models.Photo(attrs, options) 

现在我已找到一个奇怪的错误,其中添加的照片,并用相同的ID专辑(比方说2)在合并的结果。

我跟踪下来到源代码these LOC。看起来,如果不创建Backbone本身的分支,它是可撤销的。我试过了,但它也是fails 35 tests

我想起了4种不同的这样做的方法,我不知道哪个是最好的一个:

  1. 我可以添加一个前缀标识。比方说photo_2。这将导致后端的变化,以及在前端一些变化不会在/photos/photo_2
  2. 点击服务器,我可以叉骨干和change these LOC。
  3. 我可以创建两个独立的集合,但必须在视图中处理合并和排序(这会影响客户端性能并需要重写后端)
  4. 我可以从照片ID开始,比如1000000 。这将极大地降低已经上传具有给定ID的照片的给定用户也已经创建了具有相同ID的相册的可能性。

回答

7

由于1.2版本,你可以使用Collection.modelId来指定您的收藏唯一标识模型。在你的情况下,你可以做以下事情来确保你的类型有不同的ID。

var MyCollection = Backbone.Collection.extend({ 
    modelId: function (attrs) { 
     return attrs.type + "-" + attrs.id; 
    } 
    // ... 
    }) 
+0

有没有一种方法可以将模型作为参数而不是其属性? –

7

我建议两个相册和照片,添加以下内容:

idAttribute: 'uniqueId' 
    parse: function(response) { 
    response.uniqueId = type+'_'+response.id 
    return response; 
    } 
相关问题