Cómo anular Backbone.sync?


Estoy probando Backbone.js, y una de las cosas que estoy tratando es hacer una llamada a una API remota, así que necesito ser capaz de anular Backbone.sync, según entiendo la documentación.

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

Author: Scott Foubister, 2011-02-23

3 answers

Echa un vistazo a este ejemplo de fuente anotada donde sobrescriben Backbone.sync con una alternativa de localstorage

Backbone-localStorage

Básicamente Columna vertebral.sync debe ser una función que toma 4 argumentos:

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

Necesitas disparar options.success o options.error dependiendo de si el method tuvo éxito. Los métodos están en el formato:

  • "create": se espera que cree el modelo en el servidor
  • "read": espera que leas este modelo desde el servidor y devolverlo
  • "update": se espera que actualice el modelo en el servidor con el argumento
  • "delete": se espera que elimine el modelo del servidor.

Necesitas implementar esos 4 métodos y definir lo que quieras para tu "server"

Por supuesto, estas son solo las cosas que Backbone.sync debe implementar. Puede implementar más methods y puede pasar más parámetros a success pero es mejor no hacerlo este.

Es mejor asegurarse de que hace lo mismo que Backbone.sync hace actualmente para que su programación a una interfaz en lugar de una implementación. Si desea cambiar su Backbone.sync modificado por, por ejemplo, el localStorage, no tendrá que extenderlo usted mismo para que coincida con su columna vertebral extendida.sync "

[Editar]

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

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

    "sync": myOwnSpecificSync,

    ...
});

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

 225
Author: Raynos,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-20 22:29:58

Sé que esta respuesta es un poco tarde, y la respuesta de @Raynos es genial, pero lo hice 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 petición 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);
};
 15
Author: Cyril N.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-07-12 07:10:44

Normalmente necesito anular el método sync de backbone 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);
}
 11
Author: Jesse Atkinson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-10-05 18:33:13