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

In Angular, can I pass a constant to a constant?

我可以在 angular 中定义一个常数,它本身取决于传递给它的常数吗? 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 使用工厂的原因是因为我希望这两个常量在配置阶段可用。

您可以在模块的 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 };
  });
});

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

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

我结束了 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;  
    }];    
}