缩小的AngularJS给了我不可读的错误

时间:2014-01-14 09:38:00

标签: javascript angularjs

这是我使用angular.js时的堆栈跟踪:

[$injector:unpr] Unknown provider: editorPopupManagerProvider <- editorPopupManager <- libStateManager <- libInjectionManager
http://errors.angularjs.org/1.2.2/$injector/unpr?p0=editorPopupManagerProvider%20%3C-%20editorPopupManager%20%3C-%20libStateManager%20%3C-%20libInjectionManager

这是我使用angular.min.js时的堆栈跟踪:

[$injector:unpr] http://errors.angularjs.org/1.2.2/$injector/unpr?p0=editorPopupManagerProvider%20%3C-%20editorPopupManager%20%3C-%20libStateManager%20%3C-%20libInjectionManager

这只是一个简单的例子,但有时缩小的错误甚至没有帮助。

我期望两种情况下的第一个堆栈跟踪:当我使用angular.js和angular.min.js时。 我导致此异常的代码中没有问题。我故意这样做是为了演示我对angular.min.js的问题,缩小堆栈跟踪并使其真正难以理解。如果这样做的原因是为了避免最终用户看到堆栈跟踪,我明白了。但我需要正常可读的堆栈跟踪才能将其发送到日志记录服务器。

2 个答案:

答案 0 :(得分:3)

您的未知提供程序名称可能被缩小器操纵/损坏,因此您需要使用以下语法来纠正它:

myApp.controller('MyCtrl' ['$scope', function ($scope) {
    // do stuff with '$scope'
}]);

注意函数是如何包装在一个数组中的,它保留了依赖项的命名约定,因此可以安全地重新映射它们,因为字符串不会被破坏:

myApp.controller('MyCtrl' ['$scope', function (a) {
    // do stuff with 'a'
}]);

然后您可以添加其他依赖项(它们需要按照指定的顺序显示):

myApp.controller('MyCtrl' ['$scope', 'MyService', function ($scope, MyService) {
    // do stuff...
}]);

答案 1 :(得分:2)

如果您对控制器使用数组声明,则很可能是您的某些指令声明。通常我们这样做:

.controller('MyGreatCtrl',
[       '$scope','$stateParams', // even minified version does is correctly injected
function($scope , $stateParams ,) {
    ...

以上代码即使缩小也能正常工作。

但是,我们应该以同样的方式做什么 - 是Directive声明。我们可以像这样做(错误,缩小时的问题)

.directive('myGreatDirective',
    [function () {
        var directive =
        {
            restrict: 'E',
            ...
            controller: function ($scope , $element , $attrs) {
                ...
                };
            }],
        };
        return directive;

虽然这是正确的方法:

.directive('myGreatDirective',
    [function () {
        var directive =
        {
            restrict: 'E',
            ...
            // the Array declaration also here
            controller: ['$scope','$element','$attrs',
                function ($scope , $element , $attrs) {
                    ...    
                };
            }],
        };
        return directive;

指向更多详细信息的链接Dependency Injection

老实说,那是我的问题......