2013-06-03 11 views
10

Ich habe eine zusammengefügte Sammlung in Backbone, die Fotos und Alben enthält.Backbone.js: Sammlung mit mehreren Modellen mit derselben ID

Um zwischen ihnen zu unterscheiden, habe ich ein Feld type hinzugefügt, das entweder photo oder album ist. Wenn ich die Sammlung zu füllen, ich erstellen verschiedene Modelle innerhalb der Collection#model Methode

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

Jetzt habe ich einen seltsamen Fehler entdeckt, wo ein Foto und ein Album mit dem gleichen ID Hinzufügen (wir 2 sagen) führt zu einem verschmelzen.

Ich habe dies bis these LOC im Quellcode verfolgt. Es scheint, dass es ohne das Erstellen einer Abzweigung von Backbone selbst rückgängig gemacht werden kann. Ich habe es versucht aber es auch fails 35 tests.

Ich dachte an 4 verschiedenen Möglichkeiten, dies zu tun, ich weiß nicht, welche davon die besser ist, ein:

  1. ich einen Präfix zu dem ID hinzufügen könnte. Sagen wir photo_2. Dies verursacht eine Änderung im Backend sowie einige Änderungen im Frontend, um den Server unter /photos/photo_2
  2. nicht zu treffen Ich könnte Fork Backbone und change these LOC.
  3. ich zwei getrennte Sammlungen erstellen könnte aber mit einer Zusammenführung und eine Art in der Ansicht zu tun haben (die Kunden Leistung erbringt und Umschreiben des Backend benötigt)
  4. ich mit einem Foto-ID beginnen könnte, lassen Sie uns 1000000 sagen . Dies würde die Wahrscheinlichkeit extrem verringern, dass ein bestimmter Benutzer, der ein Foto mit einer gegebenen ID hochgeladen hat, auch ein Album mit der gleichen ID erstellt hat.

Antwort

7

Seit Version 1.2 Sie Collection.modelId können Sie festlegen, wie Ihre Sammlung wird eindeutig Modelle identifizieren. In Ihrem Fall können Sie Folgendes tun, um sicherzustellen, dass Ihre Typen unterschiedliche IDs haben.

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

Gibt es eine Möglichkeit, das Modell als Argument und nicht nur seine Attribute zu erhalten? –

7

Ich würde das sowohl Album und Photo vorschlagen, Sie fügen Sie folgendes:

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