I have just added a http response interceptor to one of my modules, and have encountered a circular dependency issue:
Uncaught Error: [$injector:cdep] Circular dependency found: $http <- $templateFactory <- $view <- $state <- responseInterceptor <- $http <- $translateStaticFilesLoader
Code
(function() {
'use strict';
angular
.module('app.core', ['ngAnimate',
'ngSanitize',
'ngResource',
'ui.bootstrap',
'ui.router.tabs',
'scDateTime',
'schemaForm',
'ui.validate',
'ngStorage',
'ngMaterial',
'pascalprecht.translate',
'ui.router'
])
.factory('responseInterceptor', responseInterceptor)
.config(httpProviderConfig);
responseInterceptor.$inject = ['$q', '$rootScope', '$state'];
function responseInterceptor($q, $rootScope, $state){
return {
responseError: function(response) {
$rootScope.showSpinner = false;
if(response.status === 401){
$state.go('login');
}
return $q.reject(response);
}
}
}
httpProviderConfig.$inject = ['$httpProvider'];
function httpProviderConfig($httpProvider){
$httpProvider.interceptors.push('responseInterceptor');
}
})();
I can solve this using $injector.get() to retrieve an instance instead:
responseInterceptor.$inject = ['$q', '$rootScope', '$injector'];
function responseInterceptor($q, $rootScope, $injector){
return {
responseError: function(response) {
$rootScope.showSpinner = false;
if(response.status === 401){
$injector.get('$state').go('login');
}
return $q.reject(response);
}
}
}
Whilst this works, I would rather try and get to the bottom of the problem.
Judging by the error, I think this is being caused by the following config on my app.core module
(function() {
'use strict';
angular.module('app.core').config(translateProviderConfig);
translateProviderConfig.$inject = ['$translateProvider'];
function translateProviderConfig($translateProvider) {
$translateProvider.useStaticFilesLoader({
prefix: 'assets/locale/',
suffix: '.json'
});
$translateProvider.preferredLanguage('en_gb');
return $translateProvider.useSanitizeValueStrategy('sanitize');
}
})();
So I'm unsure what to do next, is it valid to use $injector.get() or does this indicate a problem else where in the way I am including dependencies, e.g. duplicates?