描述这个并不容易,但基本上我有一个设置为提供者的服务,所以我可以配置它。它有一个在我的项目中使用的API数组,最初是空的。各种配置块可以向数组添加API对象,这似乎正在起作用。我每次都在console.log输出,并且数组正在增长。
然后我将我的服务注入其他东西(在本例中为$ http拦截器函数)并使用服务方法返回数组,但每次我得到一个空数组。
我认为这样做的方式是首先运行所有配置块,并且之后正在拦截的$ http调用正在发生,所以在截获数据时,数组应该充满API。
无论如何,这里有一些代码
angular.module('authModule').provider('authService', function(){
var _apis = [];
return({
addApi: addApi,
$get: instantiateAuth
});
function addApi(newApi){
_apis.push(newApi);
console.log("API added", _apis);
}
function instantiateAuth() {
return({
getApis: function(){
console.log("Getting APIs", _apis);
return _apis;
}
});
}
})
.config(function($httpProvider){
$httpProvider.interceptors.push(function($log, $rootScope, $q) {
return {
request: function(config) {
var injector = angular.injector(['ng', 'authModule']);
var authService = injector.get('authService');
console.log("apis", authService.getApis());
}
};
});
});
示例配置块
angular.module('myModule').config(function ($provide, authServiceProvider) {
authServiceProvider.addApi({
url: 'https://apiurl.com',
other: 'stuff'
});
authServiceProvider.addApi({
url: 'https://apiurl2.com',
other: 'stuff'
});
});
因此,每次在配置块中调用appApi方法(此处两次)时,此行输出数组console.log(“API added”,_ apis);并且它在第一次通话后正确输出1项,在第二次通话后输出两项。
当此代码 - authService.getApis() - 第一次触发HTTP调用时触发,它会将一个空数组记录到控制台。
真的很感激任何帮助。
修改
问题似乎是这一行
var injector = angular.injector(['ng','authModule']);
我的提供商似乎每次都会重置/重新创建,所以也许我误解了如何使用注入器。我原本只是在函数参数中以正常方式注入我的authService但是我得到了一个循环依赖(我的auth服务需要打开一个模态窗口,但angular-ui模式依赖于http服务,我的http调用被拦截到用我的身份验证服务检查用户是否经过身份验证:()
答案 0 :(得分:3)
是的,angular.injector(['ng', 'authModule'])
基本上创建了一个新的注入器实例(一个应用程序实例,用外行人的术语):
angular.injector(['authModule']) !== `angular.injector(['authModule'])
ng
模块默认加载,不必明确指定。单例服务只在同一个注入器实例中是单例:
injector.get('authService') === injector.get('authService');
但是
angular.injector(['authModule']).get('authService') !== `angular.injector(['authModule']).get('authService')
要重用当前的注入器实例(这在几乎所有情况下都是理想的行为),应该使用$injector
service:
$httpProvider.interceptors.push(function($log, $rootScope, $q, $injector) {
return {
request: function(config) {
var authService = $injector.get('authService');
}
};
});
$injector.get
是解决循环依赖关系的已知且直接的解决方案。