如何覆盖$ exceptionHandler的实现

有一些额外的事情,我们想要做的任何时候抛出一个JavaScriptexception。

$exceptionHandler上的文档:

angularexpression式中的任何未捕获的exception都委托给此服务。 默认实现只是委托给$ log.error,它将其logging到浏览器控制台中。

事实上,它说“默认实现”,使我觉得有一种方法,我们可以提供我们自己的服务实现,做我们想要的东西时,抛出exception。 我的问题是,你如何做到这一点? 我们如何保持所有的exception去这个服务,但是然后提供我们想要发生的function?

我发现的另一个select是通过$ provide.decorator函数“装饰” $exceptionHandler 。 如果您想将它用作自定义实现的一部分,这将为您提供对原始实现的引用。 所以,你可以做这样的事情:

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

它将执行原始exception处理程序的function,以及自定义function。

看到这个更新的小提琴 。

您可以通过创build具有相同名称的服务来覆盖$exceptionHandlerfunction:

 var mod = angular.module('testApp', []); mod.factory('$exceptionHandler', function () { return function (exception, cause) { alert(exception.message); }; }); 

看这个小提琴的样品。 如果您注释掉$exceptionHandler的工厂定义,您将看到错误将logging到控制台而不是提醒它。

这里是一个组的线程 ,有一个使用$injector注入其他服务(如$http的例子。

注意:如果您不想覆盖$exceptionHandler (或另一个内置服务)的现有function,请参阅此答案以获取有关如何修饰服务的信息。

你可以覆盖任何服务/工厂甚至$ cookieStore.If你想要一个完整的,可configuration的对象这里是一个非常好的例子 :

 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(), }