AngularJS错误:未知提供者:aProvider <- a。

16

我现在宣布自己已经秃顶了,因为我一直在努力解决这个臭名昭著的问题:被压缩过的AngularJS应用程序无法运行,报错如下:

Error: [$injector:unpr] Unknown provider: aProvider <- a http://errors.angularjs.org/1.2.6/$injector/unpr?p0=aProvider%20%3C-%20a at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11492 at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26946 at Object.c [as get] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250) at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:27041 at c (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250) at Object.d [as invoke] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26496) at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:910 at Object.f [as forEach] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11927) at http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:856 at j (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:5:27235)

许多其他人也遇到了这个问题,但看起来可以通过将依赖项声明为数组而不是裸函数参数来解决,像这样:

angular.module('my-app').controller('LoginCtrl', [ '$scope', 'HttpService', function($scope, HttpService) { ... }]);

不要这样做:

angular.module('my-app').controller('LoginCtrl', function($scope, HttpService) { ... });

但在我的情况下它不起作用。我检查了所有的脚本(包括咖啡和生成的JavaScript),它们都使用了正确的数组样式声明。

问题显然不是来自于额外的包。我尝试将所有额外的包引用从 <!-- bower:js --> 块中移出(这样它们就不会被grunt缩小),但问题仍然存在。这意味着,应该是我的代码有问题…但我已经尝试了(似乎是)唯一可用的修复方法,但无济于事。

任何提示,即使是如何正确调试它?

先行致谢!


你能禁用代码压缩,看看是哪个提供商抛出了此错误吗? - Chandermani
如果我禁用代码压缩,只使用 grunt serve,应用程序就可以完美运行,没有任何错误。 - An Phan
1
禁用您的模块,逐一检测代码中出错的部分。您的 DI 存在问题。 - Jscti
问题在于,如果我禁用一个模块,整个应用程序将无法启动,这使得调试变得不可能。 - An Phan
请查看此项目:https://github.com/btford/ngmin。 NgMin应该有助于缩小您的Angular应用程序。 - akn
@czwek 我在这个项目中使用yeoman,所以ngmin默认已经存在。 - An Phan
3个回答

27

最终我找到了问题所在。没错,这是一个我错过的 DI bug。

对于所有可能遇到同样困扰的人:数组格式声明也必须在$routeProviderresolve选项中进行。在我的情况下(使用 Coffeescript):

app.config (['$routeProvider', ($routeProvider) ->
  $routeProvider
    .when '/',
      templateUrl: 'views/main.html'
      controller: 'MainCtrl'
      resolve: 
        groups: ['GroupService', (GroupService) ->  # I MISSED THIS
          return GroupService.getAll()
        ]
        entries: ['EntryService', (EntryService) ->  # AND THIS
          return EntryService.getAll()
        ]
    # ...
])

希望这能有所帮助!


请问您能否发布生成的JS代码? - Matthias Max
我花了一整天的时间,试图解决一个问题,最终发现问题竟然如此简单。 - user4237179

3
如果您使用隐式注入而不是显式声明依赖项,则可能会出现此行为。在我的经验中,我遇到了某些特定类型的Angular.js服务问题,这些服务返回可实例化类(例如创建抽象控制器类或其他特定情况)。
例如:AbstractBaseControllerClass 在缩小过程中,我遇到了同样的问题。我通过使用内部声明的依赖注入来解决了这个问题。
希望这能帮助到您。

你救了我的命。我花了很多时间,解决方案是在我的一个提供程序内部声明! - Alexandre Nucera

0

对于不喜欢CoffeeScript的人。

我只是把我的一些代码放进去了。

 $stateProvider

    .state('screen', {
        url: '/user/',
        templateUrl: 'user.html',
        controller: 'UserController',
        controllerAs: 'user',
        location: "User",
        resolve: ['$q', 'UserService', '$state', '$timeout', authenticateUser
        ]
    })

function authenticateUser($q, UserService, $state, $timeout) {

    UserService.getLoginStatus().then(function () {
        if (UserService.user) {
            console.log("is user");
            return $q.when();
        } else {
            console.log("not user");

            $timeout(function () {
                // This code runs after the authentication promise has been rejected.
                // Go to the log-in page
                $state.go('login')
            });
            return $q.reject()

        }
    });

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接