11 votes

Comment ajouter un gestionnaire d'erreur par défaut à tous les modèles Backbone?

Contexte :

Le modèle Backbone offre une option pour enregistrer un gestionnaire d'erreurs de secours qui sera appelé à chaque fois qu'un appel au serveur échoue et qu'aucun gestionnaire spécifique n'est fourni.

MyModel = new Backbone.Model.extend({
  initialize: function(option) {
    this.on("error", this.fallbackErrorHandler);
  },

  fallbackErrorHandler: function() {
    // comportement par défaut en cas d'erreur
  },

  foo: function() {
    this.fetch();             // fallbackErrorHandler sera appelé
    this.fetch({              // le gestionnaire d'erreur en ligne sera appelé
      error: function() {
        // du code spécifique pour cette erreur
      }
    });
  }    
});

Ce que je veux faire :

Je voudrais que tous les modèles backbone de mon application aient un gestionnaire d'erreurs de secours. Mais - je ne veux pas ajouter explicitement le gestionnaire pour chaque modèle. Je voudrais définir et enregistrer le gestionnaire une fois et qu'il soit appliqué à chaque modèle backbone de mon application. De plus, je ne veux pas changer le code existant et je ne veux pas changer la façon dont les développeurs définissent les modèles dans mon application.

Ce que j'ai déjà essayé :

J'ai ajouté un initialiseur qui enregistre un gestionnaire sur l'objet Backbone.Model.prototype.

App.Marionette.addInitializer(function() {
  Backbone.Model.prototype.on("error",function(){
     // comportement par défaut en cas d'erreur
  });
});

Ce code a fonctionné et mon gestionnaire d'erreurs de secours a été appelé. Cependant, l'effet secondaire de ce code était que tous les gestionnaires d'erreurs enregistrés dans n'importe quel modèle backbone de l'application étaient enregistrés sur le Backbone.Model.prototype au lieu de sur le Backbone.Model. Donc évidemment ce n'est pas une bonne solution.

J'ai également pensé à définir MyModel qui étend le Backbone.Model et enregistre le gestionnaire par défaut. Tous les autres modèles de mon application étendront alors MyModel au lieu d'étendre directement Backbone.Model. Cependant, j'essaie de le faire de manière transparente sans avoir à changer le code existant et ensuite d'instruire tous les développeurs à étendre MyModel au lieu de Backbone.Model.

Est-ce que quelqu'un a une solution à ce problème ?

6voto

Derick Bailey Points 37859

Backbone utilise par défaut les appels de méthode AJAX de jQuery. Vous pouvez vous y connecter directement, au lieu d'utiliser Backbone :

http://api.jquery.com/ajaxError/

Si cela ne vous donne pas ce que vous voulez, vous pouvez remplacer la méthode "fetch" du modèle de Backbone :

var originalFetch = Backbone.Model.prototype.fetch;

Backbone.Model.prototype.fetch = function(options){

  var originalError = options.error;

  options.error = function(model, error){
    if (originalError){ originalError(model, error); }

    // appelez votre gestionnaire d'erreurs global ici.
    App.myGlobalErrorHandler(model, error);

  }

  originalFetch.apply(this, arguments);
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X