我正在遵循John Papa的角度样式指南(https://github.com/johnpapa/angular-styleguide#routing),并在本指南中提供的角度ui路由器周围使用自定义包装。但是,包装器对我不起作用,并且在注入$ state时出现循环依赖项错误:

Uncaught Error: [$injector:cdep] Circular dependency found: $rootScope <- $timeout <- $$rAF <- $$animateQueue <- $animate <- toastr <- logger <- $exceptionHandler <- $rootScope <- $state <- routerHelper


我尝试使用$ injector手动注入$ state,但这给了我一个未知的提供程序错误。

这是代码:

(function() {
'use strict';

angular
    .module('blocks.router')
    .provider('routerHelper', routerHelperProvider);

routerHelperProvider.$inject = ['$locationProvider', '$stateProvider', '$urlRouterProvider', '$injector'];

function routerHelperProvider($locationProvider, $stateProvider, $urlRouterProvider) {


    this.$get = RouterHelper;

    $locationProvider.html5Mode(true);

    RouterHelper.$inject = ['$state'];

    function RouterHelper($state) {
        var hasOtherwise = false;

        var service = {
            configureStates: configureStates,
            getStates: getStates
        };

        return service;

        function configureStates(states, otherwisePath) {
            states.forEach(function (state) {
                $stateProvider.state(state.state, state.config);
            });
            if (otherwisePath && !hasOtherwise) {
                hasOtherwise = true;
                $urlRouterProvider.otherwise(otherwisePath);
            }
        }

        function getStates() {
            return $state.get();
        }
    }

}
})();

最佳答案

我认为这是烤面包机的问题,而不是UI路由器代码的问题。

John Papa的示例基于普通的“ toastr”包装,而不是“ angular-toastr”包装。

吐司:https://github.com/CodeSeven/toastr

角烤面包机:https://github.com/Foxandxss/angular-toastr

使用“ toastr”包,他使用一个常量注册toastr的全局实例:

    .module('app.core')
    .constant('toastr', toastr);


这使得它可以注入到记录器服务中:

logger.$inject = ['$log', 'toastr'];

/* @ngInject */
function logger($log, toastr) {




但是,如果您使用angular-toastr包,则toastr对象会引入一些对某些Angle对象的依赖关系:

$rootScope <- $timeout <- $$rAF <- $$animateQueue <- $animate <- toastr


这会导致循环依赖,因为$ rootScope具有使用logger / toastr对象的异常处理:

toastr <- logger <- $exceptionHandler <- $rootScope




我不确定如何正确地重构它以消除循环依赖。因此,作为临时的解决方法,我更改了记录器服务,以使用$ injector延迟toastr依赖项的解析。这并不理想,但是我可以继续处理其他紧迫的问题。

logger.$inject = ['$log', '$injector']; // 'toastr'

/* @ngInject */
function logger($log, $injector) { // toastr

    var service = {
        showToasts: true,

        info    : info,
        success : success,
        warning : warning,
        error   : error,

        // straight to console; bypass toastr
        log     : $log.log
    };

    return service;
    /////////////////////


    function info(message, data, title) {
        var toastr = $injector.get('toastr');

        toastr.info(message, title);
        $log.info('Info: ' + message, data);
    }

    function success(message, data, title) {
        var toastr = $injector.get('toastr');

        toastr.success(message, title);
        $log.info('Success: ' + message, data);
    }

    function warning(message, data, title) {
        var toastr = $injector.get('toastr');

        toastr.warning(message, title);
        $log.warn('Warning: ' + message, data);
    }

    function error(message, data, title) {
        var toastr = $injector.get('toastr');

        toastr.error(message, title);
        $log.error('Error: ' + message, data);
    }

}

关于javascript - ui-router包装中的Angular.js循环依赖项错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33583633/

10-13 02:22