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