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

主要的问题 – 可能吗? 我试过没有运气..

主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 

有任何想法吗?

谢谢!

底线是:

  • 不能将服务注入提供程序configuration部分
  • 您可以将服务注入初始化提供程序服务的部分

细节:

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

阶段1:configuration

config阶段,所有提供者都被初始化,并且所有的config部分都被执行。 config部分可能包含configuration提供者对象的代码,因此他们可以注入提供者对象。 但是,由于提供者是服务对象的工厂,并且在此阶段提供者没有完全初始化/configuration – >在此阶段, 您不能要求提供者为您创build服务 – >在configuration阶段,您不能使用/注入服务 。 当这个阶段完成后,所有的提供者都准备好了(在configuration阶段完成之后,没有更多的提供者configuration可以完成)。

阶段2:运行

run阶段,所有的run部分都被执行。 在这个阶段,供应商已经准备就绪,可以创build服务 – >在run阶段,您可以使用/注入服务

例子:

1.将$http服务注入提供者初始化函数不起作用

 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 

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

2.注入$http服务到服务初始化函数工作:

 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阶段执行的服务初始化函数中,此代码将起作用。

这可能会给你一个小小的杠杆:

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

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

这是一个老问题,如果我们要依靠图书馆的核心能力,似乎有一些鸡蛋的事情正在发生。

我没有从根本上解决这个问题,而是做了旁观。 创build一个包装整个身体的指令。 防爆。

 <body ng-app="app"> <div mc-body> Hello World </div> </body> 

现在mc-body需要在渲染之前(一次),例如。

 link: function(scope, element, attrs) { Auth.login().then() ... } 

Auth是服务或提供者,例如。

 .provider('Auth', function() { ... keep your auth configurations return { $get: function($http) { return { login: function() { ... do something about the http } } } } }) 

在我看来,我确实控制了bootstrap的顺序,它是在常规引导程序parsing所有提供程序configuration之后,然后尝试初始化mc-body指令。

而且这个指令在我看来可以在路由之前,因为路由也是通过指令ex注入的。 <ui-route /> 。 但是我可能在这方面是错的。 需要更多的调查。

针对你的问题“任何想法?”,我会回答“是”。 但是等等,还有更多!

我build议在configuration中使用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); } }); }]);