73 votes

Comment redéfinir l'implémentation de $ exceptionHandler

Il y a quelques choses supplémentaires que nous voulons faire à tout moment un javascript exception est levée.

De docs sur $exceptionHandler:

Toute exception non interceptée dans angulaire expressions est confiée à ce service. Le défaut de mise en œuvre de simplement les délégués à $log.erreur qui il enregistre dans le navigateur de la console.

Le fait qu'il dit "implémentation par défaut" me fait penser, il ya une façon que nous pouvons fournir notre propre mise en œuvre pour le service, et de faire les choses que nous voulons quand une exception est levée. Ma question est, comment voulez-vous faire cela? Comment pouvons-nous garder toutes les exceptions d'aller à ce service, mais alors fournir des fonctionnalités que nous voulons arriver?

173voto

dnc253 Points 11784

Une autre option que j'ai trouvé, c'est de "décorer" l' $exceptionHandler grâce à l' $fournir.décorateur de fonction. Cela vous donne une référence à la mise en place initiale si vous voulez l'utiliser comme une partie de votre coutume de mise en œuvre. Ainsi, vous pouvez faire quelque chose comme ceci:

mod.config(function($provide) {
    $provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
        return function(exception, cause) {
            $delegate(exception, cause);
            alert(exception.message);
        };
    }]);
});

Il va faire ce que l'original gestionnaire d'exception, en plus des fonctionnalités personnalisées. Voir cette mise à jour de violon.

56voto

Gloopy Points 16421

Vous pouvez remplacer l' $exceptionHandler de la fonctionnalité de création d'un service du même nom:

var mod = angular.module('testApp', []);

mod.factory('$exceptionHandler', function () {
    return function (exception, cause) {
        alert(exception.message);
    };
});

Voir ce violon pour un échantillon. Si vous commentez l'usine de définition pour l' $exceptionHandler vous verrez l'erreur se connecter à la console plutôt que de les alerter.

Voici un groupe de thread qui a un exemple d'injecter d'autres services comme l' $http l'aide $injector.

Remarque: si vous ne voulez pas écraser les fonctionnalités existantes de l' $exceptionHandler (ou une autre construite en service) voir cette réponse pour plus d'informations sur la façon de décorer un service.

-5voto

Bartlomiej Skwira Points 193

Vous pouvez remplacer n'importe quel service / fabrique même $ cookieStore.Si vous voulez un objet complet et configurable, voici un très bel exemple :

 var myApp = angular.module('myApp', []);

//provider style, full blown, configurable version     
myApp.provider('helloWorld', function() {

    this.name = 'Default';

    this.$get = function() {
        var name = this.name;
        return {
            sayHello: function() {
                return "Hello, " + name + "!"
            }
        }
    };

    this.setName = function(name) {
        this.name = name;
    };
});

//hey, we can configure a provider!            
myApp.config(function(helloWorldProvider){
    helloWorldProvider.setName('World');
});


function MyCtrl($scope, helloWorld, helloWorldFromFactory, helloWorldFromService) {

   helloWorld.sayHello(),
}
 

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