AngularJS常量

时间:2014-07-18 18:12:55

标签: javascript angularjs constants

是否可以使用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>

提前感谢您的帮助!

7 个答案:

答案 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#",[]);

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

})
在chrome中打开浏览器,在浏览器的控制台中查看结果。你感谢你。