web-dev-qa-db-ja.com

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

次の2つの定数は、私が達成したいことです

75
raulricardo21

コントローラー、サービス、その他の間の依存関係を定義する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 を確認してください。

これであなたの質問に答えられるといいのですが。

45
lao

これを行う簡単な方法は次のとおりです。

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

146
Linkmichiel

私はこのようにします:

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

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

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

プロバイダーの定数にアクセスする必要がない限り、これは正常に機能します。

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

それが可能かどうかはわかりません。ただし、回避策は、基本定数を通常の定数として定義し、高次のものをクロージャーを使用するサービスとして定義して、変更できないようにすることです。

大まかな例:

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

あまりエレガントではありませんが、仕事を成し遂げるべきです。

4
Thalis K.

@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は非常にクールなので、定数を変更することさえできます。

2
fracz