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 )