2013-03-04 6 views
7

sto usando una chiave composta nel mio modello e generare l'ID in base alla mia chiave composta:Backbone fa POST invece di mettere su aggiornamenti quando chiave composta viene utilizzato

app.Assignment = Backbone.Model.extend({ 
    idAttribute : [ 'personId', 'jobId' ], 
    parse : function(resp) { 
     resp.id = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
}); 

ma Backbone pensa ancora che tutte le istanze di assegnazione sono nuovi, anche se sto impostando l'id nel metodo di analisi quando li prelevo dall'API. Di conseguenza, Backbone non esegue DELETE e fa un POST anziché PUT sugli aggiornamenti. Come posso aggirare questo o qual è il "modo giusto" per farlo?

Aggiornamento:

Sembra sostituzione resp.id con this.id risolve il problema.

+1

Backbone non supporta chiavi composite, pertanto la definizione di idAttribute come matrice non è valida. Ogni modello deve avere un campo id. Come sono gli URL delle risorse? – jevakallio

+0

Supporta le chiavi composite: https://github.com/documentcloud/backbone/pull/1558 in realtà l'ho risolto facendo this.id = ... invece di resp.ide = ... –

+5

Ah, sei utilizzando https://github.com/caseywebdev/backbone-composite-keys. Avrebbe avuto senso menzionarlo nella domanda. – jevakallio

risposta

2

I risultati del metodo di una Backbone.Model parse vengono passati al metodo set, che imposta il attributi del modello. Il punto di confusione per te è che l'ID del modello non è uno dei suoi attributi; è una delle sue proprietà.

Quindi, quello che succede è questo:

  1. i dati grezzi ritorna dal server e viene passato al parse
  2. Che stessi dati grezzi, ora aumentata con un attributo id, viene passato a set
  3. set aspetto e il tuo idAttribute ([ 'personId', 'jobId' ]) e tutte le chiavi dei dati grezzi
  4. Poiché nessuno di questi tasti corrispondono al idAttribute, n uno di questi viene utilizzato come ID del modello e quindi si ottiene il problema.

La soluzione di impostazione this.id all'interno parse opere, ma potrebbe causare problemi lungo la strada perché parse è generalmente progettato per operare su di essa di ingresso (dati grezzi), non modificare il modello stesso; quella parte dovrebbe succedere dopo quando si chiama set. Una soluzione più pulita sarebbe invece di fare qualcosa di simile al seguente:

app.Assignment = Backbone.Model.extend({ 
    // note that no idAttribute is specified, leaving it as the default "id" 
    parse : function(resp) { 
     resp.id = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
} 

Oppure, se si desidera che un attributo ID diverso ...

app.Assignment = Backbone.Model.extend({ 
    idAttribute: 'personAndJobId', 
    parse : function(resp) { 
     resp.personAndJobId = resp.personId + "_" + resp.jobId; 
     return resp; 
    } 
} 
0

A parte i problemi idAttribute qui, si può sempre forza Backbone per utilizzare un determinato metodo HTTP tramite le opzioni di tipo passate a save().

model.save(null, { type: 'put' })

0

ho mai lavoro con ID composito Backbone, ma credo che questo potrebbe essere una risposta facile al vostro problema:

initialize: function() { 
     this.set("id", this.generateID()); 
}, 
generateID = function() { 
    return this.personId + + "_" + this.jobId; 
} 

Con questo codice in voi definizione del modello Backbone sei creando un ID univoco per ogni modello e non dovresti avere problemi per l'aggiornamento e salvarlo (e non è necessario impostare alcun idAttribute).

Problemi correlati