2016-04-20 2 views
0

Meine Anwendung benötigt beim Start der Anwendung einige Konfigurationswerte. Vorschläge aus der Community sind, sie so konstant wie ein separates Modul zu speichern, vorzugsweise in einer separaten .js-Datei. Das könnte für mich funktionieren.
Allerdings sind meine Konfigurationswerte auch auf dem Server gespeichert und wollen diese nicht auf der Client-Seite duplizieren, also dachte ich daran, Server-Aufruf zu machen, um diese zu bekommen.
Im Anfänger zu eckig, ist es gültige Design-Praxis, Server-Aufruf in Modul Config-Methode zu machen? Wenn ja, sollte ich einfach $ http Service verwenden, um die Werte vom Server zu bekommen?Wie erhalten Sie Config-Werte vom Server in Angular?

var main = angular.module('myapp', ['AdalAngular']); 

    main.config(['$stateProvider',$httpProvider, adalAuthenticationServiceProvider', function ($stateProvider,$httpProvider,adalProvider) { 

     // $stateProvider configuration goes here 

     // ?????CAN I make server call here to get configuration values for adalProvider.init method below??? 

     adalProvider.init(
      { 
       instance: 'someurl', 
       tenant: 'tenantid', 
       clientId: 'clientid', 
       extraQueryParameter: 'someparameter', 
       cacheLocation: 'localStorage', 
      }, 
      $httpProvider 
      ); 

    }]); 

    main.run(["$rootScope", "$state", ..... 
     function ($rootScope, $state,.....) { 

      // application start logic 

     }]); 


    main.factory("API", ["$http", "$rootScope", function ($http, $rootScope) { 

     // API service that makes server call to get data 

    }]); 

EDIT1

Vorschläge So basiert unter ich erklärt konstanten Ansatz werde. Grundsätzlich werde ich eine separate config.js-Datei haben und während des Deployment-Prozesses überschreibe ich die Datei config.js mit der entsprechenden, auf der Umgebung basierenden Datei config.js.

Frage
Wenn dann auf 10 Konstanten haben, ich habe sie(), um module.config separat zu übergeben. Ist es möglich, einen konstanten Wert als JSON-Objekt zu deklarieren und irgendwie in der Config-Funktion zu lesen, so dass ich 10 verschiedene Parameter nicht habe?

angular.module('myconfig', []) 
      .constant('CONFIGOBJECT','{Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}'); 

und wie lese ich dann die Werte in der Config-Methode?

var main = angular.module('myapp',['myconfig']); 
main.config(['CONFIGOBJECT',function(CONFIGOBJECT){ 

?? How do I read CONFIGOBJECT value that is a string not json object? 

}) 
+0

Eine Konstante muss keine Zeichenkette sein. Es kann alles sein. Entferne die Anführungszeichen um den Wert: '{Const1:" someValue ", ...}' und nicht ''{Const1:" someValue ", ...}' –

Antwort

1

Sie kann nicht einen Dienst in den config Abschnitt injizieren.
Sie können einen Dienst in den run Abschnitt injizieren.

So können Sie nicht verwenden - zum Beispiel $http Servicedaten innerhalb config() vom Server abgerufen werden, aber man kann in Inneren run(), tun, was den Service des Anbieters initialisiert.

Siehe auch ausführlichere Antwort here.

Hoffe, das hilft.

UPDATE:

Warum string?Warum gehst du nicht einfach

verwenden
.constant('CONFIGOBJECT', {Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue} 

für

.constant('CONFIGOBJECT', '{Const1:somevalue,Const2:somevalue,Const3:somevalue,Const4:somevalue}' 

?

+0

danke siehe EDIT1 – LP13

+0

siehe meine Antwort update – MarcoS

2

Nur Provider sind während der Config-Phase verfügbar, keine Services. Sie können also $ http während dieser Phase nicht verwenden.

Sie können es jedoch während der Ausführungsphase verwenden (in einer Funktion, die an run() übergeben wird).

Eine Alternative besteht darin, eine vom Server dynamisch generierte JavaScript-Datei zu erstellen und die gewünschten Konstanten zu definieren.

Eine andere Alternative ist, eine solche JS-Datei während des Builds zu generieren, basierend auf einer Datei, die vom serverseitigen Code gelesen werden würde.

2

Ich werde die im Projekt verwendete Lösung beschreiben, an der ich vor einiger Zeit gearbeitet habe.

Es ist wahr, dass Sie kann nicht Verwendung Dienste in Config Phase, und es ist auch wahr, dass Sie können Verwendung Provider und Konstanten während Config Phase. So haben wir die nächste Lösung: erstens wir einfaches Objekt mit Config, wie

erstellt
var config = { 
    someConfig1: true, 
    someConfig2: false, 
    someConfigEvents: { 
     event1: 'eventConfig1', 
     event2: 'eventConfig2' 
    } 
    etc... 
} 

Dann auch wir Winkelwert mit jQuery lib erklärt:

app.value('jQuery', jQuery); 

Und jetzt können wir Dienste nicht nutzen, wie $ http, aber wir können jQuery verwenden, so dass wir nur einen Ajax-Aufruf an den Config-Server machen und unsere Konfiguration erweitern:

+0

danke. Dies könnte funktionieren. Ich habe mich jedoch entschlossen, mit einem konstanten Ansatz zu gehen. – LP13

Verwandte Themen