当抛出 javascript 异常时,我们需要做一些额外的事情。
来自 $exceptionHandler台的文档:
$exceptionHandler
角表达式中任何未捕获的异常都委托给此服务。默认实现只是委托给 $log.error,后者将其记录到浏览器控制台中。
事实上它说的是“默认实现”,这让我觉得我们可以为服务提供自己的实现,并在抛出异常时做我们想做的事情。我的问题是,你是怎么做到的?我们如何能够让所有异常都发生在这个服务上,然后提供我们希望发生的功能呢?
您可以通过创建具有相同名称的服务来覆盖 $exceptionHandler功能:
var mod = angular.module('testApp', []); mod.factory('$exceptionHandler', function () { return function (exception, cause) { alert(exception.message); }; });
有关样本,请参见 这把小提琴。如果注释掉 $exceptionHandler的工厂定义,您将看到错误将记录到控制台,而不是通知它。
下面是一个 群线群线群线群线,它有一个使用 $injector注入其他服务(如 $http)的示例。
$injector
$http
注意: 如果您不想覆盖 $exceptionHandler(或其他内置服务)的现有功能,请参阅 这个答案以获得关于如何装饰服务的信息。
我发现的另一个选项是通过 $提供,装潢师函数“装饰”$exceptionHandler。如果您希望将原始实现用作自定义实现的一部分,这将为您提供对原始实现的引用。所以,你可以这样做:
mod.config(function($provide) { $provide.decorator("$exceptionHandler", ['$delegate', function($delegate) { return function(exception, cause) { $delegate(exception, cause); alert(exception.message); }; }]); });
它将执行原始异常处理程序所执行的操作,以及自定义功能。
看这个 更新小提琴。
您可以覆盖任何服务/工厂,甚至 $cookieStore。如果您想要一个完整的、可配置的对象,这里是 一个很好的例子:
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(), }