2013-12-17 11 views
17

E 'possibile iniettare $ q nella sezione di configurazione del mio modulo? Di seguito è la mia sezione di configurazione del campione.

.config(['$q', function ($q) { 
    var func = function (inp) { 
     var def = $q.defer(); 

     if (inp == 1) 
      def.resolve("Success"); 
     else 
      def.reject("Failure"); 

     return def.promise; 
    }; 

    alert(func(1)); 
}]); 

Il primo errore che sto ottenendo è errore non rilevato: fornitore di Unknown: $ q da ReportModule Se cambio

.config(['$q', function ($q) {}]) 

a

.config(['$qProvider', function ($q) {}]) 

tanto sono un errore dicendo Unchaught TypeError: Object # non ha alcun metodo 'differito' da ReportModule

Sembra come i cant iniettare $ q nella sezione di configurazione. È così o sto facendo qualcosa di sbagliato? Ho un usecase in cui ho bisogno di usare $ q e $ http nella sezione di configurazione del mio modulo per l'inizializzazione. C'è qualche tecnica per farlo?

+2

'run' il metodo sul modulo viene eseguito subito dopo la fase di configurazione, forse puoi usarlo. – Chandermani

risposta

18

corretto - non si può iniettare $ http o $ q da una funzione di configurazione. Non sono ancora disponibili (sono anche configurati!).

+0

Vedere la mia risposta qui sotto per un modo per iniettare '$ http' e' $ q'. –

4

E 'possibile per me (quando configurare il routing):

resolve: { 
    simpleStringParam: ["$q", "$timeout", function($q, $timeout){ 
     var deferred = $q.defer(); 
      $timeout(function(){ 
       deferred.resolve("Allo!"); 
      },8000); 
     return deferred.promise; 
    }] 
} 
+0

funziona, grazie, ma perché timeout? – khoailang

+0

khoailang, è solo un esempio :) $ timeout è un modo per emulare un'operazione asincrona. Invece di esso è possibile utilizzare $ http, qualsiasi servizio asincrona o smth desideri – iamarsey

4

È possibile utilizzare angular.injector per caricare $http e $q, e probabilmente altri servizi nel blocco di configurazione:

angular.module('myApp').config(function() { 
    var injector = angular.injector(['ng']), 
     http = injector.get('$http'), 
     q = injector.get('$q'); 
}); 
+2

Il problema di questo è che stai iniettando servizi possibilmente non configurate. C'è una buona ragione per cui '$ http' e' $ q' non sono disponibili nella fase di configurazione - la configurazione non è garantita per essere deterministica. Questo può o non può funzionare tutto il tempo in ogni circostanza. –

+0

Questo è vero, dovrebbe essere usato con cautela e non è una buona pratica. Ma è possibile. –

+1

-1 dal 'angular.injector ([ 'ng'])' crea un nuovo iniettore, il che significa che si otterrà nuove istanze di tutto ciò che si ottiene utilizzando tale iniettore. Vedi [my fiddle] (https://jsfiddle.net/AlexanderS/Lexb8da8/). Questo è difficile da capire e può causare risultati molto inaspettati. '$ q' e '$ http' non dovrebbero essere usati direttamente in fase di configurazione. Ci sono altre possibilità. – AlexS

Problemi correlati