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);
}]);
私はあなたが設定ルーチンに定数とプロバイダーしか注入できないことを知っています、そして、私の理解はプロバイダーに依存性注入を行うことができるということです、しかし、それはこの種のシナリオに最適な方法ではないようです...
よろしくお願いします!
あなたは正しい、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);
}]);
お役に立てれば。
もう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);
これにアプローチする最良の方法は、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);
}]);
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の別の機能であり、グローバル変数の使用を排除します。
ドキュメントに関する限り: / Developer Guide/Providers
依存関係の構文をサポートしていないように見えますが、これは単なるキーと値のペアであり、値はオブジェクトになる可能性があります。
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
に値を設定してください