2014-01-11 65 views
3

我有app/providers/weather.js无法注入我提供商配置

angular.module('forecast').provider('Weather', function() {  
    var apiKey; 

    this.setApiKey = function(key) { 
    if(key) apiKey = key; 
    }; 

    this.$get = function() { 
    return { 
     ... // Some methods 
    }; 
    };  
}); 

而且我试图注入到这一点我config块:

angular.module('forecast', ['ngRoute']).config(function(WeatherProvider) {  
    WeatherProvider.setApiKey('hello1234');  
}); 

但是我得到:

Uncaught Error: [$injector:modulerr] Failed to instantiate module forecast due to: 
Error: [$injector:unpr] Unknown provider: WeatherProvider 

奇怪的是我可以成功地将Weather注入到控制器中d有权访问this.$get中的方法。

index.html

<!doctype html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Forecast</title> 
</head> 
<body ng-app="forecast"> 

    <section class="content" ng-view></section> 

    <script src="bower_components/angular/angular.js"></script> 
    <script src="bower_components/angular-route/angular-route.js"></script> 

    <script src="app/app.js"></script> 
    <script src="app/controllers/home.js"></script> 
    <script src="app/controllers/settings.js"></script> 

    <script src="app/providers/weather.js"></script> 

</body> 
</html> 

我无法找出错误的原因。我正在运行Angular 1.2.8。

回答

6

您与一个模块'forecast'工作,所以在这种情况下,我们应该/必须肯定的是,该配置已经访问了供应商。换句话说,设置这样的步骤:

// I. Module creation 
angular.module('forecast', ['ngRoute']) 
    // II. Provider definition 
    .provider('Weather', function() {  
    ... 
    } 
    // III. configuration using already known provider 
    .config(function(WeatherProvider) {  
    ... 
    }) 
; 
3

在尝试注入之前,您的提供者需要声明为模块forecast的一部分。

一种方法,涉及最少的变更现有的代码,是分离出来的模块声明和做第一:

angular.module('forecast', ['ngRoute']); 

然后使用,当你设置的配置:

angular.module('forecast').config(function(WeatherProvider) {  
    WeatherProvider.setApiKey('hello1234');  
}); 

注意到里面你angular.module

  • Withou t方括号您正在访问现有模块
  • 用方括号表示声明一个新模块。

因此,您目前正在声明模块并一次性执行配置 - 没有提供者被实例化。

demo fiddle