javascript - from - Cómo anular la implementación de $ exceptionHandler
document.title jquery (3)
Hay algunas cosas adicionales que queremos hacer cada vez que se lanza una excepción de JavaScript.
De los documentos en $exceptionHandler
:
Cualquier excepción no detectada en expresiones angulares se delega a este servicio. La implementación predeterminada simplemente delega a $ log.error que lo registra en la consola del navegador.
El hecho de que diga "implementación predeterminada" me hace pensar que hay una manera en que podemos proporcionar nuestra propia implementación para el servicio, y hacer las cosas que queremos cuando se lanza una excepción. Mi pregunta es, ¿cómo haces esto? ¿Cómo podemos mantener todas las excepciones para este servicio, pero luego proporcionamos la funcionalidad que queremos que suceda?
Otra opción que he encontrado para esto es "decorar" el $exceptionHandler
través de la función $provide.decorator . Esto le proporciona una referencia a la implementación original si desea usarla como parte de su implementación personalizada. Entonces, puedes hacer algo como esto:
mod.config(function($provide) {
$provide.decorator("$exceptionHandler", [''$delegate'', function($delegate) {
return function(exception, cause) {
$delegate(exception, cause);
alert(exception.message);
};
}]);
});
Hará lo que hace el controlador original de excepciones, además de la funcionalidad personalizada.
Vea este violín actualizado .
Puede anular cualquier servicio / fábrica incluso $ cookieStore. Si desea un objeto configurable en toda regla, aquí hay un buen ejemplo :
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(),
}
Puede anular la funcionalidad $exceptionHandler
creando un servicio con el mismo nombre:
var mod = angular.module(''testApp'', []);
mod.factory(''$exceptionHandler'', function () {
return function (exception, cause) {
alert(exception.message);
};
});
Vea este violín para una muestra. Si comenta la definición de fábrica de $exceptionHandler
, verá que el error se registrará en la consola en lugar de alertarlo.
Aquí hay un hilo de grupo que tiene un ejemplo de inyectar otros servicios como $http
usando $injector
.
Nota: si no desea sobrescribir la funcionalidad existente de $exceptionHandler
(u otro servicio integrado), consulte esta respuesta para obtener información sobre cómo decorar un servicio.