Backbone.js:包含多个具有相同ID的模型的集合

Phi*_*ess 10 javascript coffeescript backbone.js

我在Backbone中有一个合并的集合,其中包含照片和相册.

为了区分它们,我添加了type一个photo或两个字段album.当我填充集合时,我在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)
Run Code Online (Sandbox Code Playgroud)

现在我发现了一个奇怪的错误,即添加照片和具有相同ID的相册(假设2)会导致合并.

我在源代码中跟踪了这些 LOC.似乎它没有创建一个Backbone本身的分支是可以撤销的.我已经尝试过,但它也没有通过35次测试.

我想到了4种不同的方法,我不知道哪一种更好:

  1. 我可以为id添加前缀.让我们说吧photo_2.这会导致后端的更改以及前端的某些更改,从而无法访问服务器/photos/photo_2
  2. 我可以分叉Backbone并更改这些 LOC.
  3. 我可以创建两个单独的集合,但必须在视图中处理合并和排序(这会影响客户端性能并需要重写后端)
  4. 我可以从照片ID开始,比方说1000000.这将极大地降低已经上传具有给定ID的照片的给定用户也创建具有相同ID的相册的可能性.

小智 7

我建议在相册和照片上添加以下内容:

  idAttribute: 'uniqueId'
  parse: function(response) {
    response.uniqueId = type+'_'+response.id
    return response;
  }
Run Code Online (Sandbox Code Playgroud)


Ian*_*non 7

从版本1.2开始,您可以使用它Collection.modelId来指定集合如何唯一地标识模型.在您的情况下,您可以执行以下操作以确保您的类型具有不同的ID.

  var MyCollection = Backbone.Collection.extend({
    modelId: function (attrs) {
      return attrs.type + "-" + attrs.id;
    }
    // ...
  })
Run Code Online (Sandbox Code Playgroud)