Как переопределить реализацию $exceptionHandler
Есть какие-то дополнительные вещи, которые мы хотим делать в любое время, когда генерируется исключение javascript.
В документах на $exceptionHandler
:
Любое неперехваченное исключение в выражениях angular делегируется этой службе. Реализация по умолчанию просто делегирует $log.error, который регистрирует его в консоли браузера.
Тот факт, что он говорит "реализация по умолчанию", заставляет меня думать, что мы можем предоставить нашу собственную реализацию для службы и делать то, что хотим, когда возникает исключение. Мой вопрос: как вы это делаете? Как мы можем сохранить все исключения для этой службы, но затем предоставить функциональность, которую мы хотим выполнить?
Ответы
Ответ 1
Другим вариантом, который я нашел для этого, является "украсить" $exceptionHandler
с помощью функции $assist.decorator. Это дает вам ссылку на исходную реализацию, если вы хотите использовать ее как часть своей пользовательской реализации. Итак, вы можете сделать что-то вроде этого:
mod.config(function($provide) {
$provide.decorator("$exceptionHandler", ['$delegate', function($delegate) {
return function(exception, cause) {
$delegate(exception, cause);
alert(exception.message);
};
}]);
});
Он будет делать то, что делает исходный обработчик исключений, плюс пользовательские функции.
Смотрите эту обновленную скрипту.
Ответ 2
Вы можете переопределить функциональность $exceptionHandler
, создав службу с тем же именем:
var mod = angular.module('testApp', []);
mod.factory('$exceptionHandler', function () {
return function (exception, cause) {
alert(exception.message);
};
});
См. эту скрипту для образца. Если вы прокомментируете определение factory для $exceptionHandler
, вы увидите, что ошибка будет заходить на консоль, а не предупреждать об этом.
Вот групповой поток, который имеет пример ввода других сервисов, таких как $http
, используя $injector
.
Примечание:, если вы не хотите перезаписывать существующие функции $exceptionHandler
(или другой встроенной службы), см. этот ответ для получения информации о том, как украсить службу.
Ответ 3
Вы можете переопределить любую службу / factory даже $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(),
}