为什么AngularJS无法解决此依赖关系

时间:2014-09-30 05:50:49

标签: javascript angularjs dependency-injection

MyApp.js:

'use strict';

angular.module('MyApp', [
    'ngRoute',
    'MyApp.components.hello',
    'MyApp.pages.index',
    'MyApp.pages.upload'
]).

config(['$routeProvider', 'HelloService', function($routeProvider, HelloService) {
    $routeProvider.
    when('/',
    {
        templateUrl: 'pages/index/index.html',
        controller: 'IndexController'
    }).
    when('/upload',
    {
        templateUrl: 'pages/upload/upload.html',
        controller: 'UploadController' 
    }).
    otherwise({redirectTo: '/'});

    HelloService.init({
        facebook : ID_HERE
    });
}]);

您好-service.js:

'use strict';

angular.module("MyApp.components.hello", []).

factory("HelloService", function()
{
    return window.hello; //assume hello has been loaded
});

当我尝试运行它时,我收到错误Error: [$injector:unpr] Unknown provider: HelloService。为什么? HelloService在MyApp.components.hello中明确定义,它作为主应用程序的依赖项包含在内。那为什么不能找到HelloService?

3 个答案:

答案 0 :(得分:2)

查看这篇文章:

Understanding Dependency Injection由josepot

和本节

Configuring Providers

  

您可能想知道为什么如果工厂,价值等更容易,有人会费心使用提供方法设置一个成熟的提供商。答案是提供商允许大量配置。我们已经提到过,当您通过提供程序(或Angular为您提供的任何快捷方式)创建服务时,您将创建一个新的提供程序来定义该服务的构造方式。我没有提到的是,这些提供程序可以注入应用程序的配置部分,以便您可以与它们进行交互!

     

首先,Angular分两个阶段运行您的应用程序 - 配置和运行阶段。正如我们所见,配置阶段是您可以根据需要设置任何提供商的地方。这也是设置指令,控制器,过滤器等的地方。正如您可能猜到的,运行阶段是Angular实际编译DOM并启动应用程序的地方。

那么问题出在哪里?

  • 我们可以要求Providers注入.config()
  • 但是 - .config()只使用配置,而不是使用

答案 1 :(得分:1)

我认为你不能为配置块注入服务。

Module Loading & Dependencies

  

配置块 - 在提供商注册期间执行   和配置阶段。只能注入提供者和常量   到配置块。这是为了防止意外实例化   服务完全配置之前的服务。

答案 2 :(得分:0)

Config还处于与服务,提供商和工厂合作的过早阶段。 尝试将HelloService初始化部分移动到run,如下所示:

.run(['HelloService', function(HelloService) {
    HelloService.init({
        facebook : ID_HERE
    });
}])