2014-09-30 52 views
0

MyApp.js:爲什麼不能AngularJS解決這種依賴性

'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 
    }); 
}]); 

HELLO-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?

+0

正如其他人所指出的,你不能配置配置塊的內部工廠/服務。如果你想配置你的服務,改爲創建一個提供者。這可能是一個有用的鏈接:http://stackoverflow.com/questions/15666048/service-vs-provider-vs-factory/25092033#25092033 – pixelbits 2014-09-30 06:20:05

回答

1

我不認爲你可以注入一個服務配置塊。

Module Loading & Dependencies

配置塊 - 在供應商登記 和配置階段得到執行。只有提供者和常量可以注入 到配置塊中。這是爲了防止服務在完全配置之前發生意外實例化 。

+0

謝謝!我不知道,我只是天真地把這些東西放在.config中,因爲那似乎是適用的地方。將它移入.run後,它可以正確解析。 – 2014-09-30 06:00:10

2

檢查這篇文章:

Understanding Dependency Injection通過josepot

,這部分

Configuring Providers

你可能會奇怪爲什麼會有人費心去建立一個全面的如果工廠,價值等更容易提供提供方法。答案是提供商允許進行大量配置。我們已經提到,當您通過提供者創建服務(或者Angular提供的任何捷徑)時,您將創建一個新的提供者來定義該服務的構建方式。我沒有提到的是,這些提供程序可以注入到應用程序的配置部分,以便您可以與它們交互!

首先,Angular以兩個階段運行你的應用程序 - 配置和運行階段。正如我們所看到的,配置階段是您可以根據需要設置任何提供程序的地方。這也是設置指令,控制器,過濾器等的地方。您可能會猜到,運行階段是Angular實際編譯您的DOM並啓動您的應用程序的地方。

那麼,問題在哪裏?

  • 我們可以要求只爲Providers注入到.config()
  • 但是 - 他們在.config()只是用來配置,不使用
0

配置爲時尚早舞臺上明星與服務,提供商和工廠合作。 試一下HelloService的初始化部分移動到run,這樣的:

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