2011-08-08 8 views
26

Necesito uno de mis modelos principales para acceder a una variedad de URL según el tipo de acción que se realice. ¿Cómo determino la acción dentro de la función URL para poder especificar la URL adecuada? Por ejemplo:¿Cómo especifico varias URL en una aplicación de red troncal?

BORRAR:/myapipath/itemtype/id/
POST:/myapipath/especial-path/
GET:?/Myapipath /-camino especial/Código = ABC

sé cómo indique la diferencia entre un POST y todo lo demás: this.isNew()

Pero, ¿cómo puedo decir la diferencia entre un DELETE y un GET en una función model.url personalizada?

No sugiero que cambie la API del servidor. Eso no depende de mí.

Gracias!

Respuesta

55

Conceptualmente, la url de un modelo Backbone es la url GET primaria del recurso. Para usar una URL diferente para algunas de las acciones, anule la función de sincronización del modelo. Afortunadamente, Backbone makes it easy to override:

window.MyModel = Backbone.Model.extend({ 
    // ... other stuff ... 

    url: '/myapipath/special-path/?code=ABC', 

    methodUrl: { 
    'create': '/myapipath/special-path/', 
    'delete': '/myapipath/itemtype/id/' 
    }, 

    sync: function(method, model, options) { 
    if (model.methodUrl && model.methodUrl[method.toLowerCase()]) { 
     options = options || {}; 
     options.url = model.methodUrl[method.toLowerCase()]; 
    } 
    Backbone.sync(method, model, options); 
    } 
} 

Editar: Me echó otro vistazo a la fuente de la espina dorsal y notó que se funde toda la options argumento para construir los parametros, no options.params, y actualizado mi ejemplo en consecuencia.

+0

¡Bonita respuesta! No creo que options.params tenga razón, sin embargo, como Backbone.sync simplemente extiende el pasado en 'opciones', entonces cuando busca params.url, en realidad es simplemente options.url – satchmorun

+0

¡Gracias! Estaba arreglando mi respuesta cuando publicaste tu comentario. :) –

+0

Gracias - eso parece funcionar hasta el momento con algunas modificaciones menores, sobre todo, methodUrl debería tener 'crear' en lugar de 'publicar'. Hice algunos otros cambios para mis propósitos, pero nada más que valga la pena mencionar aquí. Buena respuesta. – gcdev

Cuestiones relacionadas