2012-04-11 15 views
10

Tengo un objeto que también está guardado en el servidor y estoy creando un modelo Backbone a partir de ese objeto.Cómo le digo a la red troncal que el modelo no es nuevo

Pero cuando guardo el modelo, está haciendo una solicitud PUT, que no es lo que quiero. ¿Cómo decirle a Backbone que los datos ya están en el servidor sin hacer una búsqueda?

+0

Mapas de red troncal actualizan las solicitudes para PON http://documentcloud.github.com/backbone/#Sync, entonces, ¿qué comportamiento espera? – nikoshr

+0

Pensé que las solicitudes de actualización se asignaron a POST, pero PUt se usó para crear un nuevo elemento. – archmage

+0

Si alguien quiere forzar una solicitud POST, hay [múltiples alternativas] (http://stackoverflow.com/a/41091957/1218980). –

Respuesta

18

Backbone determina la novedad de un modelo por checking if an id is set:

isNewmodel.isNew()

Ha sido salvado este modelo aún en el servidor? Si el modelo aún no tiene un id, se considera nuevo.

Y cuando se guarda un modelo,

  • si es nuevo, se emitirá una petición POST,
  • si se trata de una actualización (un id se ha establecido), una solicitud PUT será enviado

Backbone Sync documentation


Y como señaló @JayC en los comentarios:

Si hay un problema de que la identificación no puede ser, literalmente, id, puede utilizar idAttribute decir que es la "identidad" o campo de clave.

+4

Nota, si hay un problema que el ID no puede ser 'id' literalmente, puede usar idAttribute. http://documentcloud.github.com/backbone/#Model-idAttribute para decir cuál es la "identidad" o el campo clave. – JayC

+0

Una pregunta: Tengo un modelo que es nuevo (sin identificación), pero tiene otros campos establecidos en el frente. cuando guardo el modelo, está enviando una solicitud PUT. ¿No debería enviar una solicitud POST porque no hay una identificación? – archmage

+2

@archmage Extraño, debería ser un POST. Comprueba este Fiddle http://jsfiddle.net/jq98Z/, reproduce el comportamiento esperado. ¿Tal vez anuló la sincronización predeterminada o el mapeo de acción en alguna parte? – nikoshr

-1

Agregando mis dos centavos aquí, espero que evite algo de tirar del pelo que tuve que hacer.

Configuración propiedad id de un modelo directamente a través de constructor para falsa o nula no hará el truco, usted tiene que quitar realidad de la memoria a través de a través de eliminar

Por ejemplo, acabo luchado para copiar atributos de un modelo escriba a otro tipo como un nuevo modelo:

copy = Trip.clone() 
#doesn't unset the id attribute 
schedule = new models.Schedule(_.extend(copy.attributes, {id:null, trip_id:id}) 
#does unset the id attribute 
delete schedule.id 
schedule.save null, success: => 
    # back from POST vs PUT 
    ... 
Cuestiones relacionadas