Es gibt einige zusätzliche Dinge, die wir tun möchten, wenn eine Javascript-Ausnahme ausgelöst wird.
Aus den Dokumenten $exceptionHandler
:
Jede nicht erfasste Ausnahme in Winkelausdrücken wird an diesen Dienst delegiert. Die Standardimplementierung delegiert einfach an $ log.error, wodurch sie in der Browserkonsole protokolliert wird.
Die Tatsache, dass dort "Standardimplementierung" steht, lässt mich denken, dass es eine Möglichkeit gibt, unsere eigene Implementierung für den Service bereitzustellen und das zu tun, was wir wollen, wenn eine Ausnahme ausgelöst wird. Meine Frage ist, wie machst du das? Wie können wir alle Ausnahmen für diesen Service beibehalten und dann die Funktionen bereitstellen, die wir möchten?
Antworten:
Eine weitere Option , die ich für diese gefunden habe , ist zu „verzieren“ , die
$exceptionHandler
durch die $ provide.decorator Funktion. Auf diese Weise erhalten Sie einen Verweis auf die ursprüngliche Implementierung, wenn Sie diese als Teil Ihrer benutzerdefinierten Implementierung verwenden möchten. Sie können also so etwas tun:mod.config(function($provide) { $provide.decorator("$exceptionHandler", ['$delegate', function($delegate) { return function(exception, cause) { $delegate(exception, cause); alert(exception.message); }; }]); });
Es wird das tun, was der ursprüngliche Ausnahmebehandler tut, sowie benutzerdefinierte Funktionen.
Siehe diese aktualisierte Geige .
quelle
Sie können die
$exceptionHandler
Funktionalität überschreiben, indem Sie einen Dienst mit demselben Namen erstellen:var mod = angular.module('testApp', []); mod.factory('$exceptionHandler', function () { return function (exception, cause) { alert(exception.message); }; });
Sehen Sie sich diese Geige für ein Beispiel an. Wenn Sie die Factory-Definition für
$exceptionHandler
auskommentieren, wird der Fehler an der Konsole protokolliert, anstatt ihn zu benachrichtigen.Hier ist ein Gruppenthread , der ein Beispiel für das Einfügen anderer Dienste wie die
$http
Verwendung enthält$injector
.Hinweis: Wenn Sie die vorhandene Funktionalität des
$exceptionHandler
(oder eines anderen integrierten Dienstes) nicht überschreiben möchten, finden Sie in dieser Antwort Informationen zum Dekorieren eines Dienstes.quelle
Sie können jeden Service / jede Factory überschreiben, sogar $ cookieStore. Wenn Sie ein vollwertiges, konfigurierbares Objekt wünschen, ist hier ein wirklich schönes Beispiel :
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(), }
quelle