当服务注入其他地方时,Angular提供程序配置会重置

时间:2016-04-05 16:43:58

标签: javascript angularjs angular-providers

描述这个并不容易,但基本上我有一个设置为提供者的服务,所以我可以配置它。它有一个在我的项目中使用的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调用被拦截到用我的身份验证服务检查用户是否经过身份验证:()

1 个答案:

答案 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是解决循环依赖关系的已知且直接的解决方案。