2013-12-17 4 views
17

Ist es möglich, $ q in den Konfigurationsbereich meines Moduls zu injizieren? Unten ist mein Beispielkonfigurationsabschnitt.

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

Der erste Fehler ich bin immer ist Uncaught Fehler: Unbekannter Anbieter: $ q von ReportModule Wenn i

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

zu

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

dann i a bekommen Fehlermeldung: Uncaught TypeError: Object # hat keine Methode von ReportModule"verschieben"

Scheint wie ich $ q in Config-Abschnitt injizieren kann. Ist das der Fall oder mache ich etwas falsch? Ich habe einen Usecase, in dem ich $ q und $ http im config-Abschnitt meines Moduls für Initialisierung verwenden muss. Gibt es dafür eine Technik?

+2

'run' Methode auf Modul läuft nur nach der Konfigurationsphase, vielleicht können Sie das verwenden. – Chandermani

Antwort

18

Korrekt - Sie können $ http oder $ q nicht aus einer Konfigurationsfunktion injizieren. Sie sind noch nicht verfügbar (sie werden auch konfiguriert!).

+0

Siehe meine Antwort unten für eine Möglichkeit, '$ http' und' $ q' zu injizieren. –

4

Es ist möglich, für mich (beim Routing konfigurieren):

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

das funktioniert, danke, aber warum Timeout? – khoailang

+0

khoailang, es ist nur ein Beispiel :) $ Timeout ist eine Möglichkeit, asynchrone Operation zu emulieren. Statt dessen können Sie $ http, einen beliebigen asynchronen Dienst oder eine beliebige SMS verwenden. – iamarsey

4

Sie angular.injector können $http und $q und wahrscheinlich auch andere Dienste in der Config-Block zu laden:

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

Das Problem dabei ist, dass Sie möglicherweise nicht konfigurierte Dienste einstecken. Es gibt einen guten Grund, warum '$ http' und' $ q' nicht in der Config-Phase verfügbar sind - die Konfiguration ist nicht garantiert deterministisch. Dies kann oder kann nicht die ganze Zeit in jeder Situation funktionieren. –

+0

Das stimmt, es sollte mit Vorsicht verwendet werden und ist keine bewährte Methode. Aber es ist möglich. –

+1

-1 seit 'angular.injector (['ng'])' erstellt einen neuen Injektor, was bedeutet, dass Sie neue Instanzen von allem bekommen, was Sie mit diesem Injektor bekommen. Siehe [meine Geige] (https://jsfiddle.net/AlexanderS/Lexb8da8/). Dies ist schwer zu verstehen und kann zu sehr unerwarteten Ergebnissen führen. '$ q' und '$ http' sollten nicht direkt in der Config-Phase verwendet werden. Es gibt andere Möglichkeiten. – AlexS

Verwandte Themen