Ich versuche, Konstanten mit anderen Konstanten zu definieren, aber es scheint, dass dies nicht möglich ist, da die Anfangskonstante nicht bereit ist, wenn die erforderliche Konstante dies erfordert. Ich möchte sicher sein, dass dies überhaupt nicht möglich ist.
Derzeit habe ich Konstanten auf diese Weise:
angular.module('mainApp.config', [])
.constant('RESOURCE_USERS_DOMAIN', 'http://127.0.0.1:8008')
.constant('RESOURCE_USERS_API', 'http://127.0.0.1:8008/users')
// Specific routes for API
.constant('API_BASIC_INFORMATION', RESOURCE_USERS_API + '/api/info')
.constant('API_SOCIAL_NETWORKS', RESOURCE_USERS_API + '/api/social')
;
Die zweiten beiden Konstanten möchte ich erreichen.
quelle
myApp.constant
ist ein sofort aufgerufener Funktionsausdruck (IIFE). Es nennt sich so, dass Sie nicht müssen! Es sieht so aus :(function (params) {//do stuff})()
. Beachten Sie die Klammern um den Funktionsausdruck und den zusätzlichen Satz am Ende.RESOURCES
ist daher kein Funktionsausdruck, sondern das von dieser Funktion zurückgegebene Objekt .;
nach dem zurückgegebenen Objekt kein Semikolon stehen, z. B.:return { ..... };
Ich weiß, dass Sie technisch gesehen kein Semikolon benötigen, obwohl dies auf der automatischen Semikoloneinfügung von Javascript basiert, wie dieser Link - Aber was ist die beste Vorgehensweise?RESOURCES().USERS_DOMAIN
Lesen Sie zur besseren Übersicht die obigen Kommentare zum sofort aufgerufenen Funktionsausdruck (IIFE) , wenn Sie dies letztendlich tun müssen. Ich nehme an, das war der Kommentar von Helzgate, über den gelöscht wurde.Ich mache das so:
var constants = angular.module('constants', []); constants.factory("Independent", [function() { return { C1: 42 } }]); constants.factory('Constants', ["Independent", function(I) { return { ANSWER_TO_LIFE: I.C1 } }]);
quelle
constants
Modul in Ihr Hauptmodul aufzunehmen.Solange Sie keinen Zugriff auf Ihre Konstante in Anbietern benötigen, sollte dies gut funktionieren:
.constant('HOST', 'localhost') .factory('URL', function(HOST) { return "http://" + HOST })
Wenn Sie Zugriff auf Ihre Konstanten in Anbietern benötigen, müssen Sie wahrscheinlich noch etwas arbeiten:
.constants('HOST', 'localhost') .provider('DOMAIN', function(HOST) { var domain = "http://" + HOST; this.value = function() { return domain }; this.$get = this.value; }) .provider("anyOtherProvider", function(DOMAINPovider) { var domain = DOMAINProvider.value(); }; .factory("anyOtherService", function(DOMAIN) { })
quelle
Ich kann nicht sicher sagen, ob das (im) möglich ist. Eine Problemumgehung wäre jedoch, die Basiskonstanten als reguläre Konstanten und die übergeordneten Konstanten als Dienste zu definieren, die Verschlüsse verwenden, um sicherzustellen, dass sie nicht geändert werden können.
Grobes Beispiel:
angular.module('myApp').constant('BASE_CONSTS',{ 'FIRST_CONST': '10', 'SECOND_CONST': '20' }); angular.module('myServices').factory('MyServiceName', ['BASE_CONSTS', function ('BASE_CONSTS') { var SECOND_ORDER_CONST = BASE_CONSTS.FIRST_CONST * 100; return { GET_SECOND_ORDER_CONST: function() { return SECOND_ORDER_CONST; } } }]);
Und verwenden Sie es nach der Injektion des Dienstes:
MyServiceName.GET_SECOND_ORDER_CONST();
Es ist nicht sehr elegant, aber es sollte die Arbeit erledigen.
quelle
Die von @Linkmichiel bereitgestellte Lösung ist gut, aber wenn Sie unbedingt eine Konstante in einer anderen verwenden möchten, können Sie sie im Konfigurationsblock kombinieren:
angular.module("exampleApp", []) .constant('BASE_URL', 'http://127.0.0.1:8008') .constant('RESOURCES', { USERS_DOMAIN: '', USERS_API: '/users', BASIC_INFO: '/api/info' }) .config(function(BASE_URL, RESOURCES) { for (prop in RESOURCES) { RESOURCES[prop] = BASE_URL + RESOURCES[prop]; } }) .controller('WhatIsInResourcesController', function($scope, RESOURCES) { $scope.RESOURCES = RESOURCES; });
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="exampleApp"> <div ng-controller="WhatIsInResourcesController"> <pre>{{ RESOURCES | json }}</pre> </div> </div>
Nach der Konfigurationsphase werden alle Konstanten korrekt eingerichtet (probieren Sie das Snippet aus).
Die Moral der Geschichte lautet: Angular ist so cool, dass Sie sogar die Konstanten ändern können.
quelle
for (prop in RESOURCES) {
mit var deklarieren oder lassen, wiefor (let prop in RESOURCES) {
.