私は他の定数で定数を定義しようとしていますが、必要な定数が必要とするときに初期定数が準備されていないため、それはできないようです。これがまったく不可能かどうかを確認したい。
現在、私はこの方法で定数を持っています:
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')
;
次の2つの定数は、私が達成したいことです
コントローラー、サービス、その他の間の依存関係を定義するangular方法は、依存関係注入(DI)によるものです。したがって、サービスBに依存するコントローラーAがある場合、このように作成する必要があります。
var myApp = angular.module("exampleApp",[]);
myApp.controller("aCtrl", function(serviceB){
//Controller functionally here
});
angularはserviceBの依存関係を確認し、その名前で作成したサービスを探します。作成しないとエラーが発生します。
したがって、定数Bに依存する定数Aを作成する場合、AがBに依存することをangularに伝える必要があります。しかし、定数に依存関係はありません。定数は関数を返すことができますが、DIは定数に対して機能しません。これを確認してください Fiddle これにより、DIが機能するメソッドを確認できます。
だからあなたの質問に答えると、他の定数で定数を定義することはできません。
しかし、あなたはこれを行うことができます:
angular.module('projectApp', [])
.constant('domain','http://somedomain.com')
.constant('api','/some/api/info')
.service('urls',function(domain,api){ this.apiUrl = domain+api;})
.controller('mainCtrl',function($scope,urls) {
$scope.url = urls.apiUrl;
});
これを確認してください fiddle
DIについてさらに詳しく知りたい場合は、この post を確認してください。
これであなたの質問に答えられるといいのですが。
これを行う簡単な方法は次のとおりです。
var myApp = angular.module("exampleApp",[]);
myApp.constant('RESOURCES', (function() {
// Define your variable
var resource = 'http://127.0.0.1:8008';
// Use the variable in your constants
return {
USERS_DOMAIN: resource,
USERS_API: resource + '/users',
BASIC_INFO: resource + '/api/info'
}
})());
そして、次のような定数を使用します。
myApp.controller("ExampleCtrl", function(RESOURCES){
$scope.domain = RESOURCES.USERS_DOMAIN;
});
クレジット: link
私はこのようにします:
var constants = angular.module('constants', []);
constants.factory("Independent", [function() {
return {
C1: 42
}
}]);
constants.factory('Constants', ["Independent", function(I) {
return {
ANSWER_TO_LIFE: I.C1
}
}]);
プロバイダーの定数にアクセスする必要がない限り、これは正常に機能します。
.constant('Host', 'localhost')
.factory('URL', function(Host) { return "http://" + Host })
プロバイダーの定数にアクセスする必要がある場合は、さらに作業が必要だと思います。
.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) {
})
それが可能かどうかはわかりません。ただし、回避策は、基本定数を通常の定数として定義し、高次のものをクロージャーを使用するサービスとして定義して、変更できないようにすることです。
大まかな例:
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;
}
}
}]);
そして、サービスを注入した後に使用します:
MyServiceName.GET_SECOND_ORDER_CONST();
あまりエレガントではありませんが、仕事を成し遂げるべきです。
@Linkmichielが提供するソリューションは優れていますが、1つの定数を別の定数の中で必死に使用したい場合は、構成ブロックでそれらを組み合わせることができます。
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>
構成フェーズの後、すべての定数が正しくセットアップされます(スニペットを試してください)。
ストーリーの教訓は次のとおりです。Angularは非常にクールなので、定数を変更することさえできます。