10

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

为了区分它们,我添加了一个字段type,它是photoor 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)

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

我已经在源代码中追踪到这些LOC。如果不创建 Backbone 本身的分支,它似乎是可以撤消的。我试过了,但它也没有通过 35 次测试

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

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

3 回答 3

7

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

  idAttribute: 'uniqueId'
  parse: function(response) {
    response.uniqueId = type+'_'+response.id
    return response;
  }
于 2013-06-03T17:40:35.370 回答
7

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

  var MyCollection = Backbone.Collection.extend({
    modelId: function (attrs) {
      return attrs.type + "-" + attrs.id;
    }
    // ...
  })
于 2015-08-14T16:08:28.563 回答
0

idAttribute:'uniqueId'

如果在声明时此 uniqueId 未知,请尝试

idAttribute:'UUID'

我从https://www.uuidgenerator.net/生成了一个并放在这里,这里定义的这个属性不需要在模型中,所以我只是放了一个 UUID。

于 2019-07-03T16:10:05.283 回答