在app config,angular.js中使用自定义提供程序中的$ http

时间:2013-07-05 21:20:27

标签: javascript angularjs angular-services

主要问题 - 有可能吗?我试着没有运气..

主app.js

...
var app = angular.module('myApp', ['services']);
app.config(['customProvider', function (customProvider) {

}]);
...

提供商本身

var services = angular.module('services', []);
services.provider('custom', function ($http) {
});

我有这样的错误:

Uncaught Error: Unknown provider: $http from services 

有什么想法吗?

谢谢!

3 个答案:

答案 0 :(得分:158)

底线是:

  • 无法将服务注入提供商配置部分
  • CAN 将服务注入初始化提供商服务的部分

详细说明:

Angular框架有一个2阶段初始化过程:

阶段1:配置

config阶段,所有提供程序都已初始化,并且所有config部分都已执行。 config部分可能包含配置提供程序对象的代码,因此可以使用提供程序对象注入它们。 但是,由于提供者是服务对象的工厂,并且在此阶段提供者未完全初始化/配置 - > 您不能要求提供商在此阶段为您创建服务 - >在配置阶段,您不能使用/注入服务。 完成此阶段后,所有提供程序都已准备就绪(配置阶段完成后无法再进行提供程序配置)。

阶段2:运行

run阶段,所有run部分都会被执行。在此阶段提供商已做好准备并可以创建服务 - >在run阶段,您可以使用/注入服务

示例:

1。将$http服务注入提供程序初始化函数将不会工作

//ERRONEOUS
angular.module('myModule').provider('myProvider', function($http) {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function() {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

由于我们试图将$http服务注入到config阶段执行的函数中,我们将收到错误:

Uncaught Error: Unknown provider: $http from services 

这个错误实际上说的是用于创建$httpProvider服务的$http尚未就绪(因为我们仍处于config阶段)。

2。将$http服务注入服务初始化函数工作:

//OK
angular.module('myModule').provider('myProvider', function() {
    // SECTION 1: code to initialize/configure the PROVIDER goes here (executed during `config` phase)
    ...

    this.$get = function($http) {
        // code to initialize/configure the SERVICE goes here (executed during `run` stage)

        return myService;
    };
});

由于我们现在将服务注入到服务初始化函数中,该函数在run阶段执行,因此该代码将起作用。

答案 1 :(得分:62)

这可能会给你一点杠杆:

var initInjector = angular.injector(['ng']);
var $http = initInjector.get('$http');

但是要小心,成功/错误回调可能会让你处于应用启动和服务器响应之间的竞争状态。

答案 2 :(得分:-2)

在回答您的问题时,"任何想法?",我会回复"是"。但等等,还有更多!

我建议在配置中使用JQuery。例如:

var app = angular.module('myApp', ['services']);
app.config(['$anyProvider', function ($anyProvider) {
    $.ajax({
        url: 'www.something.com/api/lolol',
        success: function (result) {
            $anyProvider.doSomething(result);
        }
    });
}]);