[英]Is there a way in AngularJS to define constants with other constants?
我正在尝试用其他常量定义常量,但似乎无法完成,因为当所需的常量依赖时,初始常量还没有准备好。 我想确定这是否根本不可能。
目前我有这样的常量:
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')
;
后两个常量是我想要完成的。
一个简单的方法是这样的:
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;
});
学分: 链接
AngularJS 定义控制器、服务和其他之间依赖关系的方法是依赖注入(DI)。 因此,如果您有一个依赖于服务 B 的控制器 A,则必须像这样创建它:
var myApp = angular.module("exampleApp",[]);
myApp.controller("aCtrl", function(serviceB){
// Controller functionally here
});
看,AngularJS 将检查 serviceB 依赖项并查找您使用该名称创建的服务。 如果你不创建一个,你会得到一个错误。
所以,如果你想创建一个依赖于常量 B 的常量 A,你需要告诉 angular A 依赖于 B。但是一个常量不能有依赖。 常量可以返回一个函数,但 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;
});
如果您想了解有关 DI 的更多信息,请查看这篇文章。
我这样做:
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 提供的解决方案很好,但是如果您非常想在另一个常量中使用一个常量,则可以在配置块中组合它们:
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 非常酷,您甚至可以更改常量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.