是否可以使用AngularJS将常量注入另一个常量?
e.g。
var app = angular.module('myApp');
app.constant('foo', { message: "Hello" } );
app.constant('bar', ['foo', function(foo) {
return {
message: foo.message + ' World!'
}
}]);
我需要使用角度常量,因为我需要将它注入配置例程。即。
app.config(['bar', function(bar) {
console.log(bar.message);
}]);
我知道你只能将常量和提供者注入到配置例程中,我的理解是你可以对提供者进行依赖注入,但是,它似乎不是这类场景的最佳方法...... / p>
提前感谢您的帮助!
答案 0 :(得分:38)
你是对的,将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;
};
}]);
然后在config block中,注入一个bar的提供者实例(不是bar实例,因为它在配置阶段尚不可用):
app.config(['barProvider', function(barProvider) {
console.log(barProvider.data.message);
}]);
希望这有帮助。
答案 1 :(得分:4)
另一种方法是使用Immediately-invoked function expression定义一个函数并立即调用它。这样,表达式计算并返回函数的值,该值可以包含两个常量。
使用类似的东西可以实现这一点:
app.constant("foo", (function() {
var message = 'Hello'
return {
foo: message,
bar: message + " World!"
}
})());
然后使用常量,如:
console.log("foo: " + foo.foo);
console.log("bar: " + foo.bar);
答案 2 :(得分: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 :(得分:0)
就文件而言:/ Developer Guide / Providers
看起来它不支持依赖语法,它只是键值对,其中value可以是一个对象。
答案 4 :(得分:0)
你不能将一个常量注入另一个常量。 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并不完全支持它)。您可以使用值而不是常量,这是angularjs中的另一个功能,可以消除全局变量的使用。
答案 5 :(得分:0)
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
上设置值
答案 6 :(得分:-3)
以下是创建和使用常量的简单方法。
var app=angular.module("#app_name#",[]);在chrome中打开浏览器,在浏览器的控制台中查看结果。你感谢你。
//lets defint constant
app.constant("constantService",{attr:"this is first contant"});
app.controller("#controller_name#",function($scope,constantService){
console.log(constantService);
console.log(constantService.attr);
})