59

目前在 app.js 我有以下路线:

var gm = angular.module('gm', ['gm.services','gm.directives','gm.filters','gm.controllers','ngSanitize']);

gm.config(['$routeProvider', 'Path', function($routeProvider, Path) {

    $routeProvider.when('/login', { 
        templateUrl: Path.view('application/authentication/login.html'), 
        controller: 'authController' 
    });

    $routeProvider.when('/dashboard', { 
        templateUrl: Path.view('application/dashboard/index.html'), 
        controller: 'dashboardController' 
    }); 

    $routeProvider.otherwise({ 
        redirectTo: '/login'
    });

}]);

如您所见,我正在尝试注入 Path 依赖项。尽管我收到一条错误消息,说它找不到此提供程序。我认为这是因为配置模块提供程序首先执行。下面是我在“services.js”中的路径提供者定义

gm.factory("Path", function() {
  return {
    view: function(path) {
      return 'app/views/' + path; 
    },
    css: function(path) {
      return 'app/views/' + path; 
    },
    font: function(path) {
      return 'app/views/' + path; 
    },
    img: function(path) {
      return 'app/views/' + path; 
    },
    js: function(path) {
      return 'app/views/' + path; 
    },
    vendor: function(path) {
      return 'app/views/' + path; 
    },
    base: function(path) {
      return '/' + path; 
    }
  }
}); 

如何将此提供程序注入配置模块?

4

4 回答 4

83
  1. angular.config只接受提供者
  2. 每个服务、工厂等都是 Provider 的实例

因此,要在配置中注入服务,您只需要通过在其名称中添加“提供者”来调用服务的提供者。

angular.module('myApp')
  .service('FooService', function(){
    //...etc
  })
  .config(function(FooServiceProvider){
    //...etc
  });

根据 angularjs 提供者文档

...如果您定义工厂配方,则会在后台自动创建一个空的 Provider 类型,其$get方法设置为您的工厂函数。

因此,如果您有工厂(或服务),例如:

.factory('myConfig', function(){
  return {
    hello: function(msg){
      console.log('hello ' + msg)
    }
  }
})

$get在访问返回的对象之前,您首先需要使用该方法调用您的工厂:

.config(function(myConfigProvider){
   myConfigProvider
     .$get()
     .hello('world');
});
于 2014-10-16T15:46:32.320 回答
58

.config你只能使用提供者(例如$routeProvider)。在.run您只能使用服务实例(例如$route)。你有工厂,而不是供应商。使用三种创建方式查看此片段:服务、工厂和提供者 他们还在 Angular 文档https://docs.angularjs.org/guide/services中提到了这一点

于 2013-07-05T10:25:41.553 回答
14

您应该为此使用常量,因为除了提供程序之外,它是您在配置阶段唯一可以注入的东西。

angular.module("yourModule").constant("paths", {
  base: function(){ ... }
});
于 2013-07-05T09:51:15.187 回答
2

当我试图弄清楚同样的事情时,这个讨论对我有帮助,基本上

$routeProvider.when('/', {
                templateUrl:'views/main.html',
                controller:'MainController',
                resolve: {
                    recentPosts: ['$q', 'backendService', function($q, backendService){
                        var deferred = $q.defer();
                        backendService.getRecentPosts().then(
                            function(data) {
                                var result = data.result;
                                deferred.resolve(result);
                            },
                            function(error) {
                                deferred.reject(error);
                            }
                        );
                        return deferred.promise;
                    }]
                }
            })
于 2014-12-15T23:46:33.467 回答