Comment remplacer Backbone.sync?

145

J'essaie Backbone.js, et l'une des choses que j'essaye est de faire un appel à une API distante, donc je dois être en mesure de remplacer Backbone.sync, si je comprends bien 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 donner un exemple pour faire cela?

Picardo
la source
4
En l'absence de groupe Google, essayez de consulter la salle #documentcloud sur freenode et d'y poser votre question. Assurez-vous simplement de revenir ici et de répondre à votre propre question si vous obtenez une réponse. Il y a beaucoup de bonnes discussions là-bas et c'est bien de le codifier et de le rendre consultable pour ceux qui viennent après vous.
Andrew De Andrade
3
FYI: groups.google.com/group/backbonejs
Drew Dara-Abrams

Réponses:

225

Jetez un œil à cet exemple de source annoté où ils Backbone.syncécrasent avec une alternative de stockage local

backbone-localStorage

Fondamentalement, Backbone.sync doit être une fonction qui prend 4 arguments:

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

Vous devez tirer l'un options.successou l' autre ou options.errorselon que le a methodréussi. Les méthodes sont au format:

  • "create" : prévu que vous créez le modèle sur le serveur
  • "read" : vous attendiez à lire ce modèle sur le serveur et à le renvoyer
  • "update" : s'attend à ce que vous mettiez à jour le modèle sur le serveur avec l'argument
  • "delete" : s'attend à ce que vous supprimiez 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 qui Backbone.sync doivent être mises en œuvre. Vous pouvez en implémenter plus methodset vous pouvez renvoyer plus de paramètres, successmais il vaut mieux ne pas le faire.

Il est préférable de vous assurer qu'il fait la même chose que le Backbone.syncfait actuellement afin que votre programmation soit vers une interface plutôt qu'une implémentation. Si vous souhaitez remplacer votre modification par, Backbone.syncpar exemple, localStorage, vous n'aurez pas à l'étendre vous-même pour qu'elle corresponde à votre Backbone.sync étendu "

[Éditer]

Notez également que vous pouvez utiliser plusieurs implémentations de sync. Chaque référence à Backbone.syncest réellement (this.sync || Backbone.sync)donc il vous suffit de faire quelque chose comme:

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

    "sync": myOwnSpecificSync,

    ...
});

Backbone.syncest simplement la syncméthode globale par défaut que tous les modèles utilisent à moins que les modèles n'aient une méthode spécifiquement définie.

Raynos
la source
2
Que faire si je veux qu'un modèle soit extrait de localStorage, tandis qu'un autre extrait du serveur? Est-ce encore possible?
picardo
19
(this.sync || Backbone.sync)Voir modifier. Une autre astuce consiste à lire la source annotée du squelette. Tout y est!
Raynos
3
Le détail après [Edit] sur chaque modèle ayant sa propre synchronisation est super important! Merci!
Abel
26
+1 pour avoir mentionné le fait que vous pouvez remplacer la méthode de synchronisation d'un modèle spécifique.
Chetan
12
Juste un ajout: si vous voulez appeler la "valeur par défaut" syncde n'importe où dans votre code (généralement une surcharge sync), faites simplement un Backbone.sync.call(this, method, this, options).
asymétrique
15

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, et 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 requête ajax est effectuée.

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);
};
Cyril N.
la source
11

J'ai généralement besoin de remplacer la syncméthode de backbone lorsque je n'ai besoin de synchroniser que 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);
}
Jesse Atkinson
la source
et cela entre dans Model ou Collection.
Gabe Rainbow
3
Suggestion mineure: qu'en est-il de changer cette dernière ligne en Backbone.sync.apply(this, arguments);? C'est un peu plus flexible si vous décidez, par exemple, d'omettre l'argument "options" dans la version remplacée de sync.
Lochlan
Autre chose pour les futurs chercheurs de cette question: assurez-vous de retourner Backbone.sync a la backbonejs.org/docs/backbone.html#section-62
Lochlan
1
Vous pouvez utiliser Backbone.model.save(attributes, {patch: true})pour faire des mises à jour partielles maintenant
roborourke