Есть ли способ в 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')
    ;

Вторая вторая константа - это то, что я хочу выполнить

Ответ 1

Угловой способ определения зависимостей между контроллерами, службами и другими является зависимостью (DI). Поэтому, если у вас есть контроллер A, который зависит от службы B, вам нужно будет создать его так.

var myApp = angular.module("exampleApp",[]);

myApp.controller("aCtrl", function(serviceB){
    //Controller functionally here
});

См., Угловое будет проверять зависимость serviceB и искать службу, созданную с этим именем. Если вы его не создали, вы получите сообщение об ошибке.

Итак, если вы хотите создать константу A, которая зависит от константы B, вам нужно будет сказать, что A зависит от B. Но константа не может иметь зависимости. Константа может возвращать функцию, но DI не будет работать для константы. Проверьте этот скрипт, чтобы вы могли видеть, какие методы 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, ознакомьтесь с этим сообщением.

Надеюсь, это может ответить на ваш вопрос.

Ответ 2

Простой способ сделать это выглядит следующим образом:

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

Кредиты: ссылка

Ответ 3

Я так делаю:

var constants = angular.module('constants', []);

constants.factory("Independent", [function() {
   return {
      C1: 42
   }
}]);

constants.factory('Constants', ["Independent", function(I) {
   return {
      ANSWER_TO_LIFE: I.C1
   }
}]);

Ответ 4

Пока вам не нужен доступ к вашей константе в провайдерах, это должно работать нормально:

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

Ответ 5

Не могу точно сказать, возможно ли это (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();

Не очень элегантный, но должен выполнить свою работу.

Ответ 6

Решение, предоставляемое @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>

Ответ 7

Есть ли способ в 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",
})

Это мое решение для хранения констант и использования одной и той же константы внутри других

.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 
)