2013-12-17 13 views
17

Czy można wprowadzić wartość q w sekcji konfiguracji mojego modułu? Poniżej znajduje się moja przykładowa sekcja konfiguracji.

.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)); 
}]); 

Pierwszy błąd otrzymuję to Uncaught Error: Unknown provider: $ q od ReportModule jeśli zmienię

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

do

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

następnie uzyskać błąd informujący, że Uncaught TypeError: Object # nie ma metody "odroczenia" z ReportModule

Wygląda na to, że nie mogę wstrzyknąć $ q w sekcji konfiguracji. Czy to jest przypadek, czy robię coś nie tak? Mam usecase, gdzie muszę użyć $ q i $ http w sekcji konfiguracji mojego modułu do inicjalizacji. Czy jest jakaś technika do robienia tego?

+2

'run' metoda na module działa zaraz po etapie konfiguracji, może możesz tego użyć. – Chandermani

Odpowiedz

18

Prawidłowo - nie można wstrzyknąć $ http lub $ q z funkcji konfiguracyjnej. Nie są jeszcze dostępne (są również konfigurowane!).

+0

Zobacz poniżej moją odpowiedź na pytanie, jak wprowadzić '$ http' i' $ q'. –

4

Jest możliwe dla mnie (kiedy Konfiguracja routingu):

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

to działa, dzięki, ale dlaczego limit czasu? – khoailang

+0

khoailang, to tylko przykład :) $ timeout to metoda emulowania operacji asynchronicznej. Zamiast tego możesz użyć $ http, dowolnej usługi asynchronicznej lub czegoś, co chcesz – iamarsey

4

Można użyć angular.injector załadować $http i $q i prawdopodobnie inne usługi w bloku konfiguracyjnym:

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

Problem polega na tym, że wstrzykujesz prawdopodobnie nieskonfigurowane usługi. Jest dobry powód, dla którego '$ http' i' $ q' nie są dostępne w fazie konfiguracji - konfiguracja nie jest gwarantowana jako deterministyczna. To może lub nie działać cały czas w każdych okolicznościach. –

+0

To prawda, należy go używać z rozwagą i nie jest najlepszą praktyką. Ale jest to możliwe. –

+1

-1, ponieważ 'wpust kątowy (['ng'])' tworzy nowy wtryskiwacz, co oznacza, że ​​otrzymasz nowe przykłady wszystkiego, co otrzymasz za pomocą tego wtryskiwacza. Zobacz [moje skrzypce] (https://jsfiddle.net/AlexanderS/Lexb8da8/). Jest to trudne do zrozumienia i może powodować bardzo nieoczekiwane wyniki. "$ q" i "$ http" nie powinny być używane bezpośrednio w fazie konfiguracji. Istnieją inne możliwości. – AlexS

Powiązane problemy