2013-05-07 16 views
5

Böyle somtehing yapmak istiyorum:Açısal: çalıştırmak/modülün config sağlayıcı ve özel hizmet Karıştırma

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

Angularjs doc göre, ben benim module arasında config bloğunda bunu yapamaz, özel hizmetler var izin verilmediği gibi, olamaz çünkü $httpProvider gibi sağlayıcıları orada izin verilmez çünkü run bloğunda bunu:

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.

benimbazı yapılandırma eklemek için yapabileceğiniz Nasıl Ev yapımı bir servise dayanan?

cevap

7

Bir enjektör ve sonra, (yapılandırma fonksiyonu enjekte bağımlılığı olan karşıt olarak 'hizmet bulucu' tarzı) geri arama işlevi içinde hizmet örneği almak için her zaman mümkündür.

Her ne kadar yaygın olarak kullanılmasa da, istisnai durumlar için sorun yok.

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

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

     // ... 
     }); 
    }]) 

Ama bunun yerine yapmanın ...

Eğer Tepki önleyiciler $http belgelerinde baktınız mı?

Kimlik doğrulama için daha uygun görünüyor ve hizmetin oraya enjekte edilmesini sağlayabilirsiniz.

+1

Sonunda, benim kullanım durumumda olduğu gibi, tam olarak aynı değeri veren $ httpProvider yerine '$ http' yapılandırması yaptım. Teşekkürler. –

+0

'angular.injector' kullanmanın ve modül tarafından kullanılacak aynı servis örneğini almanın herhangi bir yolu' config (...) 'yöntemini kullanıyorsunuz? –

0

Bunu, yapılandırmanızın içerdiği işlevlere bildiğim kadarıyla enjekte edebilirsiniz. Auth hizmetimi kullanarak giriş yapmıyorsanız, kesişme isteklerine benzer bir şey kullanırım.

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

Çalışmıyor, istek trafolarını okuyan yöntem diziler değil geri arama bekler, dolayısıyla bir 'TypeError: object işlevi değil 'olur. –

İlgili konular