web-dev-qa-db-ja.com

AngularJS定数

AngularJSを使用して定数を別の定数に注入することは可能ですか?

例えば.

var app = angular.module('myApp');

app.constant('foo', { message: "Hello" } );

app.constant('bar', ['foo', function(foo) { 
    return { 
        message: foo.message + ' World!' 
    } 
}]);

これを設定ルーチンに挿入する必要があるため、angular定数を使用する必要があります。

app.config(['bar', function(bar) {
    console.log(bar.message);
}]);

私はあなたが設定ルーチンに定数とプロバイダーしか注入できないことを知っています、そして、私の理解はプロバイダーに依存性注入を行うことができるということです、しかし、それはこの種のシナリオに最適な方法ではないようです...

よろしくお願いします!

35
miklz

あなたは正しい、fooとbarの両方を定数として登録することは不可能です。

回避策としてプロバイダーを使用する場合も、プロバイダーインスタンスにデータを保存する必要があることを除いて、ほぼ正しく設定できます。

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

app.constant('foo', {
    message: 'Hello'
});

app.provider('bar', ['foo', function(foo) {
  this.data = {
    message: foo.message + ' World!'
  };

  this.$get = function() {
    return this.data;
  };
}]);

そして、構成ブロックで、バーのプロバイダーインスタンスを挿入します(構成フェーズではまだ使用できないため、バーインスタンスではありません)。

app.config(['barProvider', function(barProvider) {
  console.log(barProvider.data.message);
}]);

お役に立てれば。

42
runTarm

もう1つの方法は、 即時呼び出し関数式 を使用して関数を定義し、すぐに呼び出すことです。このように、式は関数の値を評価して返します。関数の値は2つの定数で構成されます。

これは、次のようなものを使用して実現できます。

app.constant("foo", (function() {
    var message = 'Hello'
    return {
        foo: message,
        bar: message + " World!"
    }
})());

そして、次のような定数を使用します。

console.log("foo: " + foo.foo);
console.log("bar: " + foo.bar);
4
S.Dav

これにアプローチする最良の方法は、2番目の定数をプロバイダーにすることです。つまり.

var app = angular.module('myApp');

app.constant('foo', { message: "Hello" } );

app.provider('bar', ['foo', function(foo) { 
    this.$get = function() { 
        return { 
            message: foo.message + ' World!' 
        };
    } 
}]);

その後:

app.config(['bar', function(bar) {
    console.log(bar.message);
}]);
3
miklz

1つの定数を別の定数に挿入することはできません。 Angularはそれを許可しません。しかし、以下のようにサービスを使用することで達成できます。

angular.module('myApp', [])
    .constant('firstName','John')
    .constant('lastName','Smith')
    .service('name',function(firstName,lastName) {
        this.fullName = firstName + ' ' + lastName;
    })
    .controller('mainCtrl',function($scope,name) {
        $scope.name = name.fullName;
    });

また、アドオンでは、定数値が将来変更される場合、定数は準備ができているだけなので、定数を使用しても意味がありません(ただし、javascriptは完全にサポートしていません)。定数の代わりにvaluesを使用できます。これは、angularjsの別の機能であり、グローバル変数の使用を排除します。

0
kalimsayyad

ドキュメントに関する限り: / Developer Guide/Providers

依存関係の構文をサポートしていないように見えますが、これは単なるキーと値のペアであり、値はオブジェクトになる可能性があります。

0
GnrlBzik
    myApp.constant('bar', {
    get message() {
        Object.defineProperty(this, 'message', {
            value: angular.injector(['myApp']).get('foo').message,
            writable: false,
            enumerable: true,
            configurable: true
        });
        return this.message;
    }
})

このような遅延読み込みを使用して、最初のgetに値を設定してください

0
Sergey Sahakyan