2013-10-04 34 views
31

È possibile eseguire DI in un metodo provider?Come iniettare dipendenze in un fornitore usando Angularjs?

In questo esempio

angular.module('greet',[]) 
.provider('greeter',function() { 

    this.$get=function() { 

    }; 
}) 
.service('greeterService',function($http){ 
    console.log($http); 
}) 
; 

Iniettare $http in servizio sembra essere la corretta applicazione, ma non funziona in un metodo provider e getta un errore:

Unknown provider: $http

fa il metodo fornitore funziona con DI per iniettare servizi?

risposta

55

Si può certamente iniettare $http al fornitore. Assicurati che appaia in $get, non nel costruttore di funzioni. Come segue:

angular.module('greet',[]).provider('greeter',function() { 
    this.$get = function($http) { 

    }; 
}); 
+1

Grazie. Significa che non possiamo usare $ http (o altri servizi) al di fuori di $ get? – Chung

+0

No, è possibile utilizzare $ http ovunque sia possibile iniettare un servizio. $ get è solo uno di questi. –

+1

e come renderlo accettabile? –

2

In realtà si deve iniettare la dipendenza da $ ottenere e quindi memorizzare in modo da utilizzare su ciò che si recupera da $ ottenere. Non bello per niente ...

3

No, non è possibile iniettare un servizio nel provider stesso. L'inserimento di un servizio nel metodo $ get di un provider è uguale all'immissione di un servizio in un factory, ma non è possibile inserirlo direttamente nella funzione provider.

La differenza tra $ get e il provider stesso è che il provider viene eseguito durante il module loading phase mentre il $ get viene eseguito durante l'istanziazione del servizio che si sta fornendo.

Ciò implica che non è possibile utilizzare alcun servizio durante la fase di caricamento/configurazione del modulo dei moduli. Questo è tutto ciò che viene eseguito all'interno dei blocchi di configurazione, ad esempio quando si definiscono percorsi o stati delle app, non è possibile usufruire di alcun servizio.

L'unica altra cosa che è possibile iniettare nei blocchi di configurazione oltre ai provider sono costanti.

Si potrebbe fare qualcosa come suggerito da IgrCndd. Ma se hai bisogno di consumare il provider in un blocco di configurazione, che è lo scopo del provider, dopotutto, non avrai i tuoi valori iniettati fino a molto dopo. Quindi non funzionerà a meno che non si faccia un brutto scherzo usando le promesse.

Further reading on injectables

9

È possibile iniettare costanti e altri fornitori in un fornitore. Non servizi o fabbriche - con una eccezione. Sembra che sia possibile iniettare il servizio $injector in un provider, almeno in AngularJS 1.3.16.

.provider('foo', ['$injector', function ($injector) { 
    var messagePrefix = $injector.get('msgPrefix'); 
    this.message = ''; 

    this.$get = function() { 
    var that = this; 
    return function() { 
     return messagePrefix + that.message; 
    } 
    }; 
}]) 

È possibile utilizzare l'iniettore di fuori del metodo $get, ma non è ancora possibile ottenere servizi da essa al momento della configurazione.

See here for a demo.

6

Facendo seguito alla risposta di IgrCndd, ecco un modello che potrebbe evitare potenziali cattiveria:

angular.module('greet',[]).provider('greeter', function() { 

    var $http; 

    function logIt() { 
     console.log($http); 
    } 

    this.$get = ['$http', function(_$http_) { 
     $http = _$http_; 

     return { 
      logIt: logIt 
     }; 
    }]; 
}); 

Nota quanto simile questo è al servizio equivalente, rendendo la conversione tra i due meno fastidioso:

angular.module('greet',[]).factory('greeter', ['$http', function($http) { 

    function logIt() { 
     console.log($http); 
    } 

    return { 
     logIt: logIt 
    }; 
}); 
Problemi correlati