¿Cómo anular Backbone.sync?


145

Estoy probando Backbone.js, y una de las cosas que estoy intentando es hacer una llamada a una API remota, por lo que necesito poder anular Backbone.sync, ya que entiendo la documentación .

No hay un ejemplo de cómo hacerlo en la documentación misma, y ​​no parece haber un grupo de Google para Backbone ... ¿alguien puede señalar un ejemplo para hacer esto?


44
En ausencia de un grupo de Google, intente revisar la sala #documentcloud en freenode y haga su pregunta allí. Solo asegúrese de regresar aquí y responder su propia pregunta si obtiene una respuesta. Hay muchas discusiones geniales allí y es bueno codificarlo y hacer que se pueda buscar para aquellos que vienen después de ti.
Andrew De Andrade

Respuestas:


225

Eche un vistazo a este ejemplo de fuente anotada donde se sobrescribe Backbone.synccon una alternativa de almacenamiento local

backbone-localStorage

Básicamente, Backbone.sync debería ser una función que tome 4 argumentos:

Backbone.sync = function(method, model, options) { };

Necesitas disparar options.successo options.errordependiendo de si methodtuvo éxito. Los métodos están en el formato:

  • "create" : esperaba que creara el modelo en el servidor
  • "read" : esperaba que leyeras este modelo desde el servidor y lo devolvieras
  • "update" : esperaba que actualizara el modelo en el servidor con el argumento
  • "delete" : espera que elimine el modelo del servidor.

Necesita implementar esos 4 métodos y definir lo que quiera para su "server"

Por supuesto, estas son solo las cosas que Backbone.sync deben implementar. Puede implementar más methodsy puede pasar más parámetros a, successpero es mejor no hacerlo.

Es mejor asegurarse de que haga lo mismo que Backbone.synchace actualmente para que su programación a una interfaz en lugar de una implementación. Si desea cambiar su modificado Backbone.syncpara decir el localStorage, no tendrá que extenderlo usted mismo para que coincida con su Backbone.sync extendido "

[Editar]

También tenga en cuenta que puede usar múltiples implementaciones de sync. Cada referencia a Backbone.synces actaully, (this.sync || Backbone.sync)así que solo tienes que hacer algo como:

var MyModel = Backbone.Model.extend({ 
    ...

    "sync": myOwnSpecificSync,

    ...
});

Backbone.synces solo el predeterminado global que usan todos los modelos a menos que los modelos tengan un syncmétodo establecido específicamente.


2
¿Qué sucede si quiero que un modelo recupere de localStorage, mientras que otro obtiene del servidor? ¿Es eso posible todavía?
picardo

19
(this.sync || Backbone.sync)Ver editar. Un consejo adicional es leer la fuente anotada de columna vertebral. ¡Todo está ahí!
Raynos

3
¡El detalle después de [Editar] sobre cada modelo que tiene su propia sincronización es súper importante! ¡Gracias!
Abel

26
+1 por mencionar el hecho de que puede anular el método de sincronización de un modelo específico.
Chetan

12
Solo una adición: si desea llamar al "valor predeterminado" syncdesde cualquier parte de su código (generalmente un overrydden sync), simplemente haga un Backbone.sync.call(this, method, this, options).
asimétrico

15

Sé que esta respuesta es demasiado tarde, y la respuesta de @Raynos es excelente, pero lo hice de manera un poco diferente, y tal vez sería útil para usted o para cualquier otra persona que intente usar una API con Backbone.

En lugar de anular Backbone.sync, anulé Backbone.ajax , porque es donde se realiza la solicitud ajax.

Aquí hay un ejemplo:

// Set the default implementation of `Backbone.ajax` to proxy through to `$`.
Backbone.ajax = function() {
    var args = Array.prototype.slice.call(arguments, 0);

    // Here, I add the OAuth token (or any other token)
    // But before, I check that data exists, if not I add it
    if (args[0]['data'] === undefined) {
        args[0]['data'] = {};
    }
    args[0]['data']['token'] = 'any_api_token_here';

    return Backbone.$.ajax.apply(Backbone.$, args);
};

11

Normalmente necesito anular el syncmétodo de red troncal cuando solo necesito sincronizar ciertos atributos. Una implementación típica se ve así:

sync: function (method, model, options) {
  options.data = _.pick(this.attributes, 'foo', 'bar', 'baz');
  return Backbone.sync.call(this, method, model, options);
}

y eso entra en Modelo o Colección.
Gabe Rainbow

3
Sugerencia menor: ¿qué hay de cambiar esa última línea a Backbone.sync.apply(this, arguments);? Es un poco más flexible si, por ejemplo, decide omitir el argumento "opciones" en la versión anulada de sync.
Lochlan

Algo más para los futuros buscadores de esta pregunta: asegúrese de devolver Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan

1
Puede usar Backbone.model.save(attributes, {patch: true})para hacer actualizaciones parciales ahora
roborourke
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.