![](/img/trans.png)
[英]Injecting $http into angular factory($exceptionHandler) results in a Circular dependency
[英]Circular Dependency in Angular JS exceptionHandler
尝试将依赖项( $cordovaDialogs
)注入到注入$exceptionHandler
服务的工厂中时,出现以下错误:
错误:
[$injector:cdep]
找到循环依赖项:$rootScope <- $q <- $cordovaDialogs <- logger <- $exceptionHandler <- $rootScope
这是我的$log
自定义代码, exception
工厂和exceptionHandler
装饰器的代码。
记录仪工厂
(function() {
'use strict';
angular
.module('app.logger')
.factory('logger', logger);
logger.$inject = ['$log','$cordovaDialogs'];//error here...
function logger($log,$cordovaDialogs) {
console.log($cordovaDialogs);
...
}());
例外工厂
(function() {
'use strict';
angular
.module('blocks.exception')
.factory('exception', exception);
exception.$inject = ['logger'];
/* @ngInject */
function exception(logger) {
var service = {
catcher: catcher
};
return service;
function catcher(message) {
return function(reason) {
logger.error(message, reason);
};
}
}
})();
ExceptionHandler装饰器
(function() {
'use strict';
angular
.module('blocks.exception')
.provider('exceptionHandler', exceptionHandlerProvider)
.config(config);
/**
* Must configure the exception handling
* @return {[type]}
*/
function exceptionHandlerProvider() {
/* jshint validthis:true */
this.config = {
appErrorPrefix: undefined
};
this.configure = function (appErrorPrefix) {
this.config.appErrorPrefix = appErrorPrefix;
};
this.$get = function() {
return {config: this.config};
};
}
/**
* Configure by setting an optional string value for appErrorPrefix.
* Accessible via config.appErrorPrefix (via config value).
* @param {[type]} $provide
* @return {[type]}
* @ngInject
*/
function config($provide) {
$provide.decorator('$exceptionHandler', extendExceptionHandler);
}
/**
* Extend the $exceptionHandler service to also display a toast.
* @param {Object} $delegate
* @param {Object} exceptionHandler
* @param {Object} logger
* @return {Function} the decorated $exceptionHandler service
*/
function extendExceptionHandler($delegate, exceptionHandler, logger) {
return function(exception, cause) {
var appErrorPrefix = exceptionHandler.config.appErrorPrefix || '';
var errorData = {exception: exception, cause: cause};
exception.message = appErrorPrefix + exception.message;
$delegate(exception, cause);
/**
* Could add the error to a service's collection,
* add errors to $rootScope, log errors to remote web server,
* or log locally. Or throw hard. It is entirely up to you.
* throw exception;
*
* @example
* throw { message: 'error message we added' };
*/
logger.error(exception.message, errorData);
};
}
})();
可能是什么问题?
将委托人包装到一个函数中以创建一个单独的范围:
function override(exception, cause) { var $http = $injector.get('$http'); } function delegator($delegate, $injector) { return override; } function provider($provide) { $provide.decorator('$exceptionHandler', ['$delegate', '$injector', delegator]); } angular.module('test', []); angular.module('test').config(provider);
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="test"></div>
我找不到确切的根本原因,但通过使用$ injector而不是通过将依赖项作为参数来解决依赖项,已解决了此问题。
((() => {
"use strict";
angular
.module("exceptionhandler")
.config(config);
config.$inject = ["$provide"];
function config($provide) {
$provide.decorator("$exceptionHandler", ["$delegate", "$injector", extendExceptionHandler]);
}
//passing $injector service
function extendExceptionHandler($delegate: any, $injector) {
return (exception: any, reason: any) => {
//resolve the ExceptionHandlerService dependency using $injector. You can use any resolve any dependency here.
var exceptionHandlerService: Common.Exception.IExceptionHandlerService = $injector
.get("ExceptionHandlerService");
$delegate(exception, reason);
};
}
})());
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.