Как переопределить реализацию $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(),
}