2013-06-03 16 views
10

私は、写真とアルバムを含むBackboneにマージされたコレクションを持っています。Backbone.js:同じIDを持つ複数のモデルを含むコレクション

これらを区別するために、フィールド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) 

内の異なるモデルを作成する今、私は、同じIDを持つ写真やアルバムを追加し、マージでの結果(のは2を言わせて)奇妙なバグをdiscoverdました。

私はこれをthese LOCのソースコードで追跡しました。バックボーン自体を作成することなく元に戻すことができるようです。私はそれを試しましたが、それはまたfails 35 testsです。

私は、私は1つ優れているそれらのどれかわからない、これを行うための4種類の方法を考えた:

  1. 私はIDに接頭辞を追加することができます。 photo_2としましょうこれは、バックエンドの変更だけでなく、フロントエンドのいくつかの変更をサーバーにヒットしないようにします。/photos/photo_2
  2. バックボーンとchange these LOCをフォークできます。
  3. 私は2つの別々のコレクションを作成しますが、マージ、ビューのソートに対処する可能性があり
  4. 私は写真のIDで開始することができ
  5. (クライアントのパフォーマンスに影響を与えるとバックエンドの書き換えが必要)、の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; 
    } 
関連する問題