【问题标题】:AngularJS constantsAngularJS 常量
【发布时间】:2014-09-09 23:09:15
【问题描述】:

是否可以使用 AngularJS 将一个常量注入另一个常量?

例如

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);
}]);

我知道你只能将常量和提供程序注入配置例程,我的理解是你可以对提供程序进行依赖注入,但是,这似乎不是这种场景的最佳方法...

提前感谢您的帮助!

【问题讨论】:

  • 所以可以根据您自己的回答解决问题:) 问题是您为什么要这样做?真实世界的价值在哪里,为什么不直接定义依赖多个常量的服务?
  • 我这样做的原因是定义权限级别...我有定义用户角色级别和用户访问级别(访问级别取决于角色)的常量,然后将其注入到配置例程中。

标签: javascript angularjs constants


【解决方案1】:

你是对的,不可能将 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;
  };
}]);

然后在配置块中,注入 bar 的提供程序实例(不是 bar 实例,因为它在配置阶段尚不可用):

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    另一种方法是使用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);
    

    【讨论】:

      【解决方案3】:

      似乎解决此问题的最佳方法是将第二个常量设为提供者。即

      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);
      }]);
      

      【讨论】:

      • bar是服务实例,不能在config阶段注入。
      • 感谢您的澄清!这非常有用!
      【解决方案4】:
          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

      【讨论】:

        【解决方案5】:

        就文档而言:/ Developer Guide / Providers

        看起来它不支持依赖语法,它只是键值对,其中值可以是一个对象。

        【讨论】:

          【解决方案6】:

          您不能将一个常量注入另一个常量。 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;
              });
          

          对于 addon 来说,如果你的常量值在未来发生变化,那么使用常量是没有意义的,因为常量只是准备好的(但是 javascript 并不完全支持它)。您可以使用 values 代替常量,这是 angularjs 的另一个特性,它消除了对全局变量的使用。

          【讨论】:

            【解决方案7】:


            这是创建和使用常量的简单方法。

            var app=angular.module("#app_name#",[]);

            //让定义常量

            app.constant("constantService",{attr:"this是第一个常量"});

            app.controller("#controller_name#",function($scope,constantService){

            console.log(constantService);
            console.log (constantService.attr);

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-06-15
              • 1970-01-01
              • 1970-01-01
              • 2014-05-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多