web-dev-qa-db-fra.com

Comment remplacer Backbone.sync?

J'essaie Backbone.js, et l'une des choses que j'essaye est d'appeler une API distante. Je dois donc pouvoir remplacer Backbone.sync, si j'ai bien compris la documentation .

Il n'y a pas d'exemple de comment faire cela dans la documentation elle-même, et il ne semble pas y avoir de groupe Google pour Backbone ... quelqu'un peut-il indiquer un exemple pour faire cela?

145
picardo

Jetez un coup d'œil à cet exemple de source annotée où ils écrasent Backbone.sync Avec une alternative à localstorage

backbone-localStorage

En gros, Backbone.sync devrait être une fonction qui prend 4 arguments:

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

Vous devez déclencher soit options.success Ou options.error Selon que la method a réussi ou non. Les méthodes sont au format:

  • "create": Attendez que vous créiez le modèle sur le serveur
  • "read": Attendez-vous à lire ce modèle sur le serveur et à le renvoyer
  • "update": Attendez-vous à mettre à jour le modèle sur le serveur avec l'argument
  • "delete": Attendez-vous à supprimer le modèle du serveur.

Vous devez implémenter ces 4 méthodes et définir ce que vous voulez pour votre "server"

Bien sûr, ce ne sont que les choses que Backbone.sync must. Vous pouvez implémenter plus de methods et renvoyer plus de paramètres à success, mais il est préférable de ne pas le faire.

Il est préférable de s’assurer qu’il fait la même chose que Backbone.sync À l’heure actuelle pour que vous programmiez une interface plutôt qu’une implémentation. Si vous voulez remplacer votre Backbone.sync Modifié par celui du localStorage, vous n'aurez pas besoin de l'étendre vous-même pour correspondre à votre Backbone.sync étendu "

[Modifier]

Notez également que vous pouvez utiliser plusieurs implémentations de sync. Chaque référence à Backbone.sync Est effectivement (this.sync || Backbone.sync), Vous devez donc faire quelque chose comme:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.sync N'est que le modèle global par défaut utilisé par tous les modèles, à moins qu'une méthode sync ne soit spécifiquement définie pour ces modèles.

225
Raynos

Je sais que cette réponse est un peu trop tardive, et la réponse de @Raynos est excellente, mais je l'ai fait un peu différemment. Cela serait peut-être utile pour vous ou pour toute autre personne essayant d'utiliser une API avec Backbone.

Au lieu de remplacer Backbone.sync, j'ai remplacé Backbone.ajax , car c'est là que la demande ajax est faite.

Voici un exemple:

// 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
Cyril N.

J'ai généralement besoin de remplacer la méthode sync du backbone lorsque je n'ai besoin que de synchroniser certains attributs. Une implémentation typique ressemble à ceci:

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