2014-04-09 13 views
9

Ich habe ein Modul in angularJS geschrieben, das alle Backend-Kommunikationen einkapselt. Für größere Flexibilität habe ich das api-Präfix als konstanten Wert auf dem Modul (könnte Wert sein, da ich es nicht in der Config-Phase verwende). so etwas wieDie beste Methode zum Überschreiben von Modulwerten/Konstanten in angularJS

angular.module('myapp.data').constant('apiPrefix', '/api/data'); 

Jetzt möchte ich dieses Modul aus zwei verschiedenen Anwendungen nutzen. Einer benutzt/api1/data und der andere/api2/data und ich möchte dies während der Config-Phase der Anwendung ändern. Ich weiß, wie man das mit einem Provider macht, aber einen Provider zu haben, der einen Wert hält, scheint mir ein Overkill zu sein. Kann ich verwendete Modulkonstanten oder Werte aus der Anwendungskonfigurationsphase ändern?

so etwas wie:

angular.module("data", []) 
.value('apiPrefix', '/api/data') 
.factory('display', function(apiPrefix){ 
    return { 
    pref: function(){ 
     console.log(apiPrefix); 
     return apiPrefix; 
    } 
    } 
}); 


angular.module("myApp",['data']) 
.config(['apiPrefix', function(prefix){ 
    prefix = 'https:/api/data'; 
}]) 
.controller("Example", function($scope, display) { 
    $scope.prefix = display.pref; 
}); 
+1

Nicht sicher, aber Sie können versuchen, es auf 'run' Bühne zu tun. – Chandermani

+0

Ja, Sie können einen Wert in der Run-Phase zu aktualisieren, und Sie können eine Konstante in Config injizieren, aber da es eine Konstante ist, kann es nicht geändert werden http://StackOverflow.com/Questions/13035568/angular-JS-value-not -injected-in-config – shaunhusain

+0

Also was Sie sagen, ist, dass es ein Wert anstelle einer Konstante im Modul sein sollte und ändern Sie es auf Run-Phase der Anwendung anstelle der Config? – masimplo

Antwort

10

Um die Modulwerte zu überschreiben, können Sie den Winkelwert in späteren Modulen neu definieren. Ich glaube, es sollte keine Modulkonfigurationszeit gemacht werden.

angular.module("data", []) 
.value('apiPrefix', '/api/data') 
.factory('Display', function(apiPrefix){ 
    return { 
    pref: function(){ 
     return apiPrefix; 
    } 
    } 
}); 




angular.module('myapp', ['data']) 
    .value('apiPrefix', '/api2/data') 
    .controller('MainCtrl', function($scope, Display) { 
     $scope.name = Display.pref(); 
    }); 

siehe Plunker hier: http://plnkr.co/edit/k806WE

gleiche für Winkelkonstanten auch anwendbar ist.

+2

Große Lösung. Ich fülle schlecht, dass ich das nicht wusste, da ich versehentlich eine Modulkonstante oder einen Wert überschreiben könnte, da ich sie sehr oft benutze. Gut, dass ich immer versuche, eindeutige beschreibende Namen zu erstellen. – masimplo

+0

Danke @ mxa055. Eigentlich bevorzuge ich Konstanten und Werte wie Konfigurations- oder Backend-API-Endpunkte in einem separaten Konfigurationsmodul. – khanmizan

1

Angular Module, Steuerungen usw. können innerhalb von Funktionen enthalten sein, wenn-Anweisungen usw. Sie nicht auf der obersten Ebene sein müssen. So könnten Sie das in Ihrem Code einschließen:

if (environmentOne()) { 
    module.value('apiPrefix','api1/data'); 
} else { 
    module.value('apiPrefix','api2/data'); 
} 

Hoffnung, die hilft!

+0

Das klingt interessant, aber ich würde es hassen, so etwas in meinem Modul für jede andere Anwendung, die mich benutzen könnte, zu tun.Es entsteht eine "Abhängigkeit" zwischen dem Modul und seinen Benutzern. – masimplo

+0

Ah, du hast Recht. Ich habe deine Frage falsch verstanden und dachte, dass es eine Frage von Entwicklungs-/Inszenierungs-/Produktionsumgebungen ist. Khanmizans Antwort ist besser. –

6

Unser Modul

angular.module("data", []) 
    .constant('apiPrefix', '/api/data'); 

Wir constant wie value voll, außer Kraft setzen.

angular.module('myapp', ['data']) 
    .constant('apiPrefix', '/api2/data'); 

können wir auch völlig außer Kraft setzen in config

angular.module('myapp', ['data']) 
    .config(function ($provide) { 
     $provide.constant('apiPrefix', '/api2/data'); 
    }); 

können wir auch außer Kraft setzen ganz oder teilweise (wenn Objekt) in run

angular.module('myapp', ['data']) 
    .run(function (apiPrefix) { 
     apiPrefix = '/api2/data'; 
    }); 

Aber wenn wir wollen constant mit dem Objekt zu überschreiben teilweise in der Konfig (nicht im Lauf), können wir so etwas tun

angular.module("module1", []) 
    .constant('myConfig', { 
     param1: 'value1' , 
     param2: 'value2' 
    }); 

angular.module('myapp', ['data']) 
    .config(function ($provide, myConfig) { 
     $provide.constant(
      'myConfig', 
      angular.extend(myConfig, {param2: 'value2_1'}); 
     ); 
    }); 
+1

Referenz myConfig mit der Zeichenfolge, um die Erweiterungswerte auf dem Modul myapp zu überschreiben. angular.module ('myapp' [ 'data']) .config (function ($ bieten, MyConfig) { $ provide.constant ( MyConfig, angular.extend ('MyConfig', {param2: ‚value2_1 '}); ); }); – Zawarudo

+1

Danke. Ja, '$ provide.constant ('myConfig', ...' - 'myConfig' muss eine Zeichenkette sein! –

Verwandte Themen