【问题标题】:AngularJS Error: Unknown provider: aProvider <- aAngularJS 错误:未知提供者:aProvider <- a
【发布时间】:2014-06-01 13:39:18
【问题描述】:

好吧,在解决了这个臭名昭著的问题之后,我现在正式秃顶了:缩小的 AngularJS 应用程序无法正常工作,解决了这个错误:

错误:[$injector:unpr] 未知提供者:aProvider http://errors.angularjs.org/1.2.6/$injector/unpr?p0=aProvider%20%3C-%20a 在http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11492http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26946 在 Object.c [as get] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250) 在http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:27041 在 c (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26250) 在 Object.d [作为调用] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:26496) 在http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:910 在 Object.f [as forEach] (http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:4:11927) 在http://localhost/my-app/dist/scripts/1bde0e2e.vendor.js:9:856 在 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),它们都使用正确的数组样式声明。

问题显然不是来自额外的包。我尝试将所有额外的包引用移出 &lt;!-- bower:js --&gt; 块(这样它们就不会被 grunt 缩小),但问题仍然存在。这意味着,这是我的代码的错……但话又说回来,我尝试了(似乎是)唯一可用的修复程序,但无济于事。

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

提前致谢!

【问题讨论】:

  • 您能否禁用缩小并查看哪个提供商抛出此错误。
  • 好吧,如果我禁用缩小并只使用grunt serve,则不会引发错误 - 应用程序运行良好。
  • 一一禁用您的模块,以检测代码中存在错误的部分。你在某处有一个 DI 错误。
  • 问题是,如果我禁用一个模块,整个应用程序将拒绝启动,从而无法调试。
  • 检查这个项目:github.com/btford/ngmin。 NgMin 应该有助于缩小你的 Angular 应用程序。

标签: javascript angularjs coffeescript gruntjs


【解决方案1】:

我终于找到了问题所在。是的,这是一个我错过的 DI 错误。

对于所有可能遭受同样头痛的人:数组格式声明也必须在$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贴一下吗?
  • 我花了一整天的时间,试图解决一个问题,结果问题就这么简单。
【解决方案2】:

如果您使用隐式注入而不是显式声明您的依赖项,则可能会出现这种行为。根据我的经验,我在返回可实例化类的特定类型的 Angular.js 服务中遇到了此类问题(例如,创建抽象控制器类或其他一些特殊情况)。

例如:AbstractBaseControllerClass

在缩小期间,我遇到了同样的问题。我解决了使用依赖注入的内部声明。 希望这会有所帮助

【讨论】:

  • 你救了我的命。我花了很多时间,解决方案是在我的一个提供者中使用内部声明!
【解决方案3】:

对于那些不喜欢 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()

        }
    });

}

【讨论】:

    猜你喜欢
    • 2012-10-07
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 2013-02-21
    • 2013-01-25
    • 2014-07-19
    • 1970-01-01
    相关资源
    最近更新 更多