2016-04-05 7 views
1

Nicht eine einfache zu beschreiben, aber im Grunde habe ich einen Dienst, der als Anbieter eingerichtet ist, so dass ich es konfigurieren kann. Es hat eine Reihe von APIs in meinem Projekt verwendet, die zunächst leer ist. Verschiedene Konfigurationsblöcke können dem Array ein API-Objekt hinzufügen, und dies scheint zu funktionieren. Ich console.log die Ausgabe jedes Mal und das Array wächst.Angular Provider-Konfiguration zurückgesetzt, wenn der Dienst an anderer Stelle injiziert

Dann injiziere ich meinen Dienst in etwas anderes (in diesem Fall eine $ http Interceptor-Funktion) und verwenden Sie eine Service-Methode, um das Array zurückzugeben, aber jedes Mal bekomme ich ein leeres Array.

Ich dachte, die Art, wie dies funktionierte, ist, dass alle Config-Blöcke zuerst gelaufen sind und dass der $ http-Aufruf, der abgefangen wird, viel später passiert, also sollte das Array voll von APIs sein, wenn es abgefangen wird.

Wie auch immer, hier ist einiger Code

angular.module('authModule').provider('authService', function(){ 

    var _apis = []; 

    return({ 
     addApi: addApi, 
     $get: instantiateAuth 
    }); 

    function addApi(newApi){ 
     _apis.push(newApi); 
     console.log("API added", _apis); 
    } 

    function instantiateAuth() { 
     return({ 
      getApis: function(){ 
       console.log("Getting APIs", _apis); 
       return _apis; 
      } 
     }); 
    } 

}) 


.config(function($httpProvider){ 

    $httpProvider.interceptors.push(function($log, $rootScope, $q) { 
     return { 
      request: function(config) { 
       var injector = angular.injector(['ng', 'authModule']); 
       var authService = injector.get('authService'); 
       console.log("apis", authService.getApis()); 
      } 
     }; 
    }); 

}); 

Und ein Beispiel Konfigurationsblock

angular.module('myModule').config(function ($provide, authServiceProvider) { 

    authServiceProvider.addApi({ 
     url: 'https://apiurl.com', 
     other: 'stuff' 
    }); 

    authServiceProvider.addApi({ 
     url: 'https://apiurl2.com', 
     other: 'stuff' 
    }); 

}); 

Also, jedes Mal, wenn die appApi Methode in einem Config-Baustein aufgerufen wird (zweimal hier), ist diese Zeile gibt die array console.log ("API hinzugefügt", _apis); und es gibt korrekt 1 Element nach dem ersten Anruf und zwei Elemente nach dem zweiten Anruf aus.

Wenn dieser Code - authService.getApis() - beim ersten Aufruf eines HTTP-Aufrufs ausgelöst wird, wird ein leeres Array in der Konsole protokolliert.

Jede Hilfe würde wirklich geschätzt werden.

EDIT:

Das Problem scheint diese Linie

var = angular.injector Injektors ([ 'ng', 'AuthModule']) zu sein;

Mein Provider scheint jedes Mal zurückgesetzt/neu erstellt, so dass ich vielleicht missverstanden habe, wie man den Injektor verwendet. Ich habe ursprünglich nur meinen authService auf die normale Weise in die Funktionsparameter injiziert, aber ich bekam eine zirkuläre Abhängigkeit (mein Auth-Dienst muss ein modales Fenster öffnen, aber eckige-ui-modale sind auf den http-Dienst angewiesen und meine http-Aufrufe werden abgefangen überprüfen Sie mit meinem auth-Dienst, der Benutzer authentifiziert ist :()

Antwort

3

Ja, angular.injector(['ng', 'authModule']) erzeugt im wesentlichen eine neue Injektor-Instanz (eine Anwendungsinstanz, in juristischer Hinsicht):

angular.injector(['authModule']) !== `angular.injector(['authModule']) 

ng Modul ist standardmäßig geladen, Sie müssen nicht explizit angegeben werden, und Singleton-Dienste sind Singletons nur innerhalb derselben Injektorinstanz:

injector.get('authService') === injector.get('authService'); 

Aber

angular.injector(['authModule']).get('authService') !== `angular.injector(['authModule']).get('authService') 

Strominjektor Instanz wieder zu verwenden (was ein wünschenswertes Verhalten in fast jeder Situation ist) $injector service verwendet werden soll:

$httpProvider.interceptors.push(function($log, $rootScope, $q, $injector) { 
    return { 
     request: function(config) { 
      var authService = $injector.get('authService'); 
     } 
    }; 
}); 

$injector.get ist bekannt und einfache Lösung zu erhalten um zirkuläre Abhängigkeiten.

+0

Danke. Das war das erste, was ich versuchte, die zirkuläre Abhängigkeit zu umgehen, aber $ injector.get ('authService') gab undefiniert zurück, trotz der Tatsache, dass $ injector.has ('authService') true zurückgab. Ich fand das sehr merkwürdig, also versuchte es mit angular.injector (falsch). Ich habe es wieder so eingesetzt, wie du es gezeigt hast, und es kommt nicht mehr undefiniert zurück. Keine Ahnung warum, aber ich bin froh, dass es funktioniert. – jonhobbs