【问题标题】:AngularJS "Constant" FactoryAngularJS“常量”工厂
【发布时间】:2013-03-01 16:00:01
【问题描述】:

我正在努力在 AngularJS 中设置配置文件。是否可以在 AngularJS 中创建一个无法覆盖其密钥的工厂?比如我可以这样设置一个常量,不能被覆盖

module.constant('animals', {"cat": "meow", "dog": "woof"});

但我想做这样的事情,允许覆盖 ,但不允许工厂本身

module.value('catSound','meow')
      .value('dogSound','woof')
      .factory('animals', ['catSound','dogSound', function(catSound, dogSound) {
            return {
                 "cat": catSound,
                 "dog": dogSound
            }
      });

上面的工厂可以被覆盖,允许另一段代码拥有module.factory('animals',function(){ return 7 }) 并破坏一切。但是,作为工厂,各个值可以(并且应该)是可覆盖的,所以我应该能够分配 module.value('catSound','hiss') 并且仍然可以按预期工作。

我尝试过注入常量,但据我所知,这是不可能的。如何防止我的工厂声明被覆盖?我意识到 constant 在描述我想要的东西时可能不是正确的术语,但我确实希望工厂的函数 definition 是常量。

【问题讨论】:

  • 您能否提供一些关于您的用例的见解?覆盖工厂提供了很大的好处,例如在模拟测试中。
  • 基本上我只是想设置一个可以复制的默认配置文件,并修改其参数以适应各个服务器的需求(即,我们需要一个指向默认情况下开发 API,但在生产服务器上,我们希望它指向生产 API)。想法是将所有配置值保存在一个文件中,以简化默认值的更新,同时防止开发人员意外更改本地配置中的工厂输出。 value() 将允许单独更改。我敢肯定有更好的方法
  • 您找到解决问题的方法了吗?我现在正在处理同样的问题。
  • 没有什么让我特别高兴的。我已将 factory() 方法放在全局命名空间下,并正在检查它是否存在。如果命名空间存在,我不再调用工厂方法。

标签: configuration angularjs constants factory


【解决方案1】:

javascript 中的一切都是可变的,所以设置这样的东西很棘手,而且永远不会完全安全。我在 Angular 代码中四处查看,并没有发现任何证据表明有人尝试使用您似乎要求的保护机制。

我的建议是承担风险。除了测试和漂亮的长名字之外,不值得尝试保护自己。我假设你被咬过一次,但我认为几率很低,除非你定义的工厂名称很短。

【讨论】:

  • 当然,但是像 Object.seal() 和 setter 这样的东西可以提供一定程度的保护。 module.constant() 防止项目多次使用相同的方法被覆盖,所以我希望 module.factory() 定义已经有了类似的东西。
  • @IanHunter 是的,同意。不过我认为现在还没有任何东西,所以你要么必须自己做,要么生活没有......
猜你喜欢
  • 2015-03-12
  • 2015-09-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多