【问题标题】:Backbone.js: Collection containing multiple Models with same IDBackbone.js:包含多个具有相同 ID 的模型的集合
【发布时间】:2013-05-29 22:34:12
【问题描述】:

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

为了区分它们,我添加了一个字段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. 我可以为 id 添加一个前缀。假设photo_2。这会导致后端的更改以及前端的某些更改不会到达/photos/photo_2 的服务器
  2. 我可以分叉 Backbone 和 change these LOC。
  3. 我可以创建两个单独的集合,但必须在视图中处理合并和排序(这会影响客户端性能并需要重写后端)
  4. 我可以从带有照片的 ID 开始,比如说1000000。这将极大地降低已上传具有给定 ID 的照片的给定用户也创建了具有相同 ID 的相册的可能性。

【问题讨论】:

    标签: javascript backbone.js coffeescript


    【解决方案1】:

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

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

    【讨论】:

    • 有没有办法在这里获取模型作为参数而不仅仅是它的属性?
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      idAttribute:'uniqueId'

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

      idAttribute:'UUID'

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

      【讨论】:

      • 您能否编辑您的答案,使其更清晰一些,或者添加一个代码示例?
      猜你喜欢
      • 2012-07-25
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 1970-01-01
      • 2012-09-11
      相关资源
      最近更新 更多