繁体   English   中英

Angular JS exceptionHandler中的循环依赖

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM