2013-05-07 7 views
5

Chciałbym zrobić somtehing tak:kątowa: Mieszanie usługodawcy i niestandardowe usługi w konfiguracji modułu/run

angular.module('app', []).config(
    [ '$httpProvider', 'customAuthService', 
    ($httpProvider, customAuthService) -> 
     $httpProvider.defaults.transformRequest.push (data) -> 
     if customAuthService.isLoggedIn 
      data['api_key'] = {token: @token} 
    ]) 

Według Angularjs doc, nie mogę tego zrobić w bloku config z moich module, ponieważ usługi niestandardowe nie są dozwolone tam, ani nie mogę zrobić go w bloku run, bo jak $httpProvider dostawcy nie są tam dozwolone: ​​

Configuration blocks - get executed during the provider registrations and configuration phase. Only providers and constants can be injected into configuration blocks. This is to prevent accidental instantiation of services before they have been fully configured.

Run blocks - get executed after the injector is created and are used to kickstart the application. Only instances and constants can be injected into run blocks. This is to prevent further system configuration during application run time.

Jak mogę dodać trochę konfigurację w moim $httpProvider, która polega na usłudze domowej?

Odpowiedz

7

To jest zawsze możliwe, aby uzyskać wtryskiwacz, a następnie wystąpienie usługi wewnątrz funkcji zwrotnej („lokalizatora usług” stylu, w przeciwieństwie do konieczności zależność wstrzykiwany w funkcji config).

Podejrzewam, że jest w porządku w wyjątkowych przypadkach, chociaż nie jest zbyt piękny, aby z niego korzystać.

.config([ '$httpProvider', function($httpProvider) { 
    $httpProvider.defaults.transformRequest.push(function(data) { 

     var $injector = angular.injector(['app']); 
     var customAuthService = $injector.get('customAuthService'); 

     // ... 
     }); 
    }]) 

Ale, zamiast robić to ...

Pan spojrzał na przechwytujących Response w dokumentacji $http?

Wygląda lepiej nadaje się do celów identyfikacji i można uzyskać usługi wstrzykiwane tam.

+1

Skonfigurowałem '$ http' zamiast' $ httpProvider', który zapewnia dokładnie taką samą wartość, o ile chodzi o mój przypadek użycia. Dzięki. –

+0

Jakikolwiek sposób użycia 'kątowego injektora' i uzyskanie tej samej instancji usługi, która będzie używana przez moduł, który wywołujesz metodą' config (...) '? –

0

Możesz go wprowadzić do funkcji wewnątrz konfiguracji, o ile wiem. Używam czegoś podobnego do przechwytywania żądań, jeśli nie są one zalogowane przy użyciu mojej usługi uwierzytelniania.

.config(['$httpProvider',function ($httpProvider) { 
    var authRequest= ['customAuthService', function(customAuthService) { 
     if(customAuthService.isLoggedIn){ 
      data['api_key'] = {token: @token}; 
     } 
    }]; 
    $httpProvider.defaults.transformRequest.push(authRequest); 
}]); 
+0

Nie działa, metoda odczytująca żądania transformatorów oczekuje wywołań zwrotnych, a nie tablic, więc otrzymuję obiekt "TypeError: object is not a function'. –