在Angular中,我可以将常量传递给常量吗?

时间:2015-01-15 07:48:25

标签: javascript angularjs constants

我可以在角度中定义一个常量,它本身取决于传递给它的常量吗? Here's a contrived example

angular
  .constant("names", ["Bob", "Jane"])
  .constant("friends", ["names", getFriends]);

function getFriends(names) {
  var friends = {};

  names.forEach(function(name) {
    friends[name] = { firstName: name };
  });

  return friends;
}

基本上,names常量定义了一个名称数组,然后我将其传递给一个函数来生成一堆对象文字。

这段代码肯定不起作用 - 但有没有办法可以做到这种想法?我能想到的唯一一件事就是这样......

var names = ["Bob", "Jane"];

angular
  .constant("names", names)
  .constant("friends", getFriends())
  .controller("myController", MyController);

function getFriends() {
  var friends = {};

  names.forEach(function(name) {
    friends[name] = { firstName: name };
  });

  return friends;
}

...但我正在努力避免这种情况(我希望在单独的JS文件中定义常量)。

注意:我没有为friends使用工厂的原因是因为我希望在配置阶段可以使用这两个常量。

2 个答案:

答案 0 :(得分:0)

您可以在模块的config阶段where constants are available进行一些处理:

angular.module('myModule').constant('names', ['Bob', 'Jane']);
angular.module('myModule').constant('friends', {});

angular.module('myModule').config(function(names, friends) {
  names.forEach(function(name) {
    // Modifying the friends constant
    friends[name] = { firstName: name };
  });
});

请注意,虽然您无法更改对象常量引用的内容,但您可以更改对象本身。

答案 1 :(得分:0)

看起来答案是坚定的 - 你不能将常数传递给常数。

我结束了using a provider instead

angular
    .module("myApp", [])
    .constant("names", ["Bob", "Jane"])
    .provider("friends", FriendsProvider);

FriendsProvider.$inject = ["names"];

function FriendsProvider(names) {
    var self = this;
    self.friends = {};

    // ----- 8< -----  

    self.$get = [function() {
      return self.friends;  
    }];    
}