Angularjs中有一种方法可以用其他常量定义常量吗?

我试图用其他常量定义常量,但似乎无法完成,因为当需要的常量需要它时,初始常量没有准备好。 我想确定这是不是可能的。

目前我有这样的常数:

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') ; 

后两个常量是我想要完成的

定义控制器,服务和其他服务之间依赖关系的angular度方法是dependency injection(DI)。 所以如果你有一个依赖于服务B的控制器A,你将不得不像这样创build它。

 var myApp = angular.module("exampleApp",[]); myApp.controller("aCtrl", function(serviceB){ //Controller functionally here }); 

请参阅angular将检查serviceB依赖关系,并查找使用该名称创build的服务。 如果你不创build一个,你会得到一个错误。

所以,如果你想创build一个依赖于常量B的常量A,那么你需要告诉angular度A依赖于B,但是常量不能有依赖关系。 常数可以返回一个函数,但是DI不能用于常量。 检查这小提琴,所以你可以看到DI的工作方式: http : //jsfiddle.net/RMj5s/1/

所以回答你的问题,你不能用其他常量定义一个常量。

但是你可以这样做:

 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; }); 

检查这个小提琴看它的工作: http : //jsfiddle.net/kJ3tT/1/

如果你想了解更多关于DI,请看看这篇文章: http : //merrickchristensen.com/articles/javascript-dependency-injection.html

我希望这可以回答你的问题。

一个简单的方法是这样的:

 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; }); 

积分: 链接

我这样做:

 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) { }) 

不能确定是否(im)可能。 但是一个解决方法是将基本常量定义为常规常量,将高级定义为使用闭包的服务,以确保它们不能被更改。

粗糙的例子:

 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提供的解决scheme是好的,但是如果你迫切希望在另一个内部使用一个常量,你可以在configuration块中合并它们:

 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> 

Angularjs中有一种方法可以用其他常量定义常量吗?

前提我讨厌在每个.constant声明中存储单个常量,通常我使用以下语法将所有常量存储到单个声明中:

 .constant("SampleConst", { Types: { "A": "toggle", "B": "run", "C": "close", }, "MenuItems": [ { code: 100, type: "toggle" //Here I'd like use Types defined before }, { code: 200, type: "toggle" //Here I'd like use Types defined before }, }], "Nationalities": ["I", "E", "S"], "OtherCost": "TEST", }) 

这是我的解决scheme来存储常量,并在其他人中使用相同的常量

 .constant("SampleConst", function () { var _types = { TOGGLE: "toggle", RUN: "run", CLOSE: "close", }; var constants = { Types: _types , MenuItems: [ { code: 100, type: _types.TOGGLE //NOW USING CONSTANT }, { code: "200", type: _types.RUN //NOW USING CONSTANT } ], Nationalities: ["I", "E", "S"], OtherCost: "TEST" }; return constants; }() // <----- Be careful to place double () at the end )