$exceptionHandler decorator на строгих - круглых и строгих ошибках

У меня проблемы с форматированием моего $exceptionHandler в строгий. Я пытаюсь изменить обработчик исключений, чтобы регистрировать угловые ошибки на наших серверах и сообщать нам о сбоях определенных страниц. Для кода ниже, у меня есть круговые ошибки зависимости. На следующем наборе кода я получаю строгие ошибки. Обратите внимание, что мы минимизируем наш код с помощью gulp.

ошибка здесь: Обнаружена циклическая зависимость: $rootScope <- $ http <- serverlog <- $exceptionHandler <- $ rootScope


var pageApp = angular.module('pageApp',['angular-oauth2','ngCookies']);

pageApp.factory("serverlog", serverlog);
serverlog.$inject = ["$http"];
function serverlog($http) {
    var svc = {};
    svc.add = function(exception) {
        var data = angular.toJson(exception);
        console.log("Sending to server errors");
        // console.log(data);
        // $.ajax({
        //  type: "POST",
        //  url: "/api/v1/jslog",
        //  contentType: "application/json",
        //  data: data
        // });
    };
    return svc;
}

pageApp.config(['$provide', function($provide) {
    $provide.decorator("$exceptionHandler", $exceptionHandler);
    $exceptionHandler.$inject = ['$delegate','serverlog'];
    function $exceptionHandler($delegate,serverlog) {
        return function(exception, cause) {
            $delegate(exception, cause);
            serverlog.add(exception);
        }
    };
}]);

Затем к этому набору кода прибывает строгие ошибки: serverlog не использует явную аннотацию и не может быть вызван в строгом режиме

pageApp.config(['$provide', function($provide) {
  $provide.decorator("$exceptionHandler", ['$delegate','serverlog', function($delegate,serverlog) {
    return function(exception, cause) {
        $delegate(exception, cause);
        serverlog.add(exception);
    }
  }]);
}]);

1 ответ

Решение

Чтобы решить круговую зависимость, вы можете ввести $injector вместо serverlog и вместо этого разрешите зависимость во время выполнения:

pageApp.config(['$provide', function($provide) {

  $provide.decorator("$exceptionHandler", $exceptionHandler);
  $exceptionHandler.$inject = ['$delegate', '$injector'];

  function $exceptionHandler($delegate, $injector) {

    var serverlog;

    return function(exception, cause) {

      serverlog = serverlog || $injector.get('serverlog');

      $delegate(exception, cause);
      serverlog.add(exception);
    };
  }
}]);

Пробовал второй пример, но не смог повторить ошибку strictdi. Должно выдавать ту же ошибку, что и в первом примере, если вы используете тот же код для службы serverlog.

Другие вопросы по тегам