2013-06-03 5 views
10

Ho una raccolta unita in Backbone che contiene foto e album.Backbone.js: raccolta contenente più modelli con lo stesso ID

Per distinguere tra loro, ho aggiunto un campo type che è o photo o album. Quando ho popolare l'insieme, creo modelli diversi all'interno del metodo 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) 

Ora ho scoperto uno strano bug in cui l'aggiunta di una foto e un album con lo stesso ID (diciamo 2) si traduce in una fusione.

Ho rintracciato fino al these LOC nel codice sorgente. Sembra che sia annullabile senza creare un fork di Backbone stesso. L'ho provato ma anche fails 35 tests.

ho pensato di 4 modi diversi di fare questo, non so chi dei due è il migliore:

  1. potrei aggiungere un prefisso al id. Diciamo photo_2. Ciò causa un cambiamento nel back-end e alcune modifiche nel frontend per non colpire il server a /photos/photo_2
  2. Potrei forgiare Backbone e change these LOC.
  3. ho potuto creare due collezioni separate, ma hanno a che fare con una fusione e una specie nella vista (che effettua le prestazioni client e richiede una riscrittura del backend)
  4. ho potuto iniziare con un documento di identità di, diciamo 1000000 . Ciò ridurrebbe notevolmente la probabilità che un determinato utente che ha caricato una foto con un dato ID abbia anche creato un album con lo stesso ID.

risposta

7

Dalla versione 1.2 è possibile utilizzare Collection.modelId per specificare come la vostra collezione sarà identificare in modo univoco i modelli. Nel tuo caso, puoi fare quanto segue per assicurarti che i tuoi tipi abbiano ID diversi.

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

C'è un modo per ottenere qui il modello come argomento anziché solo i suoi attributi? –

7

vorrei suggerire che sia su album e foto, si aggiunge la seguente:

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