1

描述这一点并不容易,但基本上我有一个设置为提供者的服务,因此我可以对其进行配置。它有一组在我的项目中使用的 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); 并在第一次调用后正确输出一项,在第二次调用后正确输出两项。

当此代码 - authService.getApis() - 在第一次拦截 HTTP 调用时触发时,它会将一个空数组记录到控制台。

任何帮助将不胜感激。

编辑:

问题似乎是这条线

var injector = angular.injector(['ng', 'authModule']);

每次发生这种情况时,我的提供程序似乎都会被重置/重新创建,所以也许我误解了如何使用注入器。我最初只是在函数参数中以正常方式注入我的 authService 但我得到了一个循环依赖(我的身份验证服务需要打开一个模态窗口,但是 angular-ui 模态依赖于 http 服务并且我的 http 调用被拦截到使用我的身份验证服务检查用户是否已通过身份验证:()

4

1 回答 1

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服务:

$httpProvider.interceptors.push(function($log, $rootScope, $q, $injector) {
    return {
        request: function(config) {
            var authService = $injector.get('authService');
        }
    };
});

$injector.get是绕过循环依赖的已知且直接的解决方案。

于 2016-04-05T20:44:53.810 回答