$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.