una primary primaria poner llaves llave hacer foreign declarar crear con compuesto compuestas compuesta como clave campos backbone.js model composite-key

backbone.js - primary - El backbone hace POST en lugar de PUT en las actualizaciones cuando se utiliza la clave compuesta



foreign key compuesta (3)

Estoy usando una clave compuesta en mi modelo y genero la ID basada en mi clave compuesta:

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

pero Backbone todavía piensa que todas las instancias de Asignación son nuevas, aunque estoy configurando el id en el método de análisis al obtenerlas de la API. Como resultado, Backbone no elimina y hace un POST en lugar de PUT en las actualizaciones. ¿Cómo puedo solucionar esto o cuál es la "forma correcta" de hacerlo?

Actualizar:

Parece que reemplazar resp.id con this.id resuelve el problema.


Los resultados del método de parse de un Backbone.Model se pasan al método set , que establece los atributos del modelo. El punto de confusión para usted, creo, es que el ID del modelo no es uno de sus atributos; es una de sus propiedades .

Entonces, lo que sucede es esto:

  1. Sus datos brutos regresan del servidor y se pasan a parse
  2. Esa misma información sin procesar, ahora aumentada con un atributo de id , se pasa al set
  3. set looks y su idAttribute ( [ ''personId'', ''jobId'' ] ) y todas las claves en los datos brutos
  4. Dado que ninguna de esas claves coincide con el idAttribute , ninguna de ellas se utiliza como ID del modelo y, por lo tanto, obtienes tu problema.

Su solución de establecer this.id en el parse funciona, pero puede causar problemas en el this.id porque el análisis generalmente está diseñado para operar en su entrada (los datos brutos), no para modificar el modelo en sí mismo; esa parte se supone que sucederá después cuando se llame al set . Una solución más limpia sería, en cambio, hacer algo como lo siguiente:

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; } }

O bien, si desea un atributo de ID diferente ...

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


Aparte de los problemas de idAttribute aquí, siempre puede forzar que Backbone use cierto método HTTP a través de las opciones de tipo pasadas a save() .

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


Nunca he trabajado con ID compuesto en Backbone, pero creo que esta podría ser una respuesta fácil a tu problema:

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

Con este código en su definición de modelo Backbone está creando una ID única para cada modelo y no debería tener problemas para actualizarla y guardarla (y no necesita establecer ninguna idAttribute).