1

Доброе утро, У меня возникла проблема, я, похоже, не могу решить.Регистрация HTTP-перехватчика в ленивом загруженном модуле

Я пытаюсь зарегистрировать httpinterceptor в другом месте, чем исходный блок конфигурации.

Делать это работает, как ожидалось:

angular.module('app', ['ngResource']) 
.config(function($httpProvider) { 
    $httpProvider.interceptors.push(function() { 
    return { 
     request: function($request) { 
     console.log($request); 
     return $request; 
     } 
    } 
    }) 
}) 

Но перехватчик является частью субмодуля. Так что мое приложение выглядит следующим образом:

EDIT:

angular.module('app', ['ngResource']); 
angular.module('app.submodule', ['ngResource']) 
.config(function($httpProvider) { 
    $httpProvider.interceptors.push(function() { 
    return { 
     request: function($request) { 
     console.log($request); 
     return $request; 
     } 
    } 
    }) 
}) 

Дополнительно подмодуль lazyloaded. Но я не думаю, что это корень проблемы.

Я попытался ссылки на httpProvider в начальном блоке конфигурации, добавив:

$httpProviderReference = $httpProvider; 

Так что я мог зарегистрировать перехватчик позже. Это даже не работало бы в блоке initial run(). Осмотр провайдера, похоже, сработал, но перехватчик никогда не вызывается.

Кто-нибудь знает, как обойти это? Я пытаюсь добавить токен аутентификации в заголовок запроса.

Спасибо заранее, Ол

+0

Вы уверены, что angular.module ('app.submodule', []) делает то, что, по вашему мнению, он делает, мне кажется, что он просто создает новый модуль и ничего не знает о другом модуле. – Delta

+0

Я добавил зависимость от ngResource к подмодулю. это то, о чем вы говорили? когда я пытаюсь зарегистрировать перехватчик в методе запуска основных модулей, он также не работает. – olu

ответ

1

Для любого другого сталкиваясь с подобной проблемой, это то, как я сделал это:

Я зарегистрировал общий перехватчик в моем главном модуле:

angular.module('app', ['ngResource']) 
.config(function($httpProvider) { 
    $httpProvider.interceptors.push('Interceptors'); 
}) 
.factory('Interceptors', function() { 
    var requestFunctions = []; 
    return { 
    request: function($request) { 
     var r = $request; 
     for (var i = requestFunctions.length - 1; i >= 0; i--) { 
     r = requestFunctions[i]($request); 
     }; 
     return $request; 
    }, 
    setRequestFunction: function(fn) { 
     requestFunctions.push(fn); 
    } 
    } 
}) 

Завод имеет множество функций, которые называются последовательно. Исходный запрос анализируется через функции. Запрос изменен в подмодуле:

angular.module('app.submodule', ['ngResource']) 
.run(function($injector,MyService) { 
    var Interceptors = $injector.get('Interceptors'); 
    Interceptors.setRequestFunction(function($request) { 
     $request.headers['auth-id'] = MyService.getAuthData().authId; 
     $request.headers['auth-token'] = MyService.getAuthData().authToken; 
    } 
    return $request; 
    }) 
}) 

Также стоит упомянуть также о замене. Это замена для ngResource, и, похоже, возможно зарегистрировать перехватчики для Restangular в любом месте приложения.

Смежные вопросы