AngularJS 的module.constant 没有定义标准意义上的常量。
虽然它作为提供者注册机制独立存在,但最好在相关的 module.value ($provide.value) 函数的上下文中理解。官方文档清楚地说明了用例:
用 $injector 注册一个值服务,例如字符串、数字、数组、对象或函数。这是注册服务的缩写,其中提供者的 $get 属性是一个工厂函数,不接受任何参数并返回值服务。这也意味着不可能将其他服务注入到价值服务中。
将此与module.constant ($provide.constant) 的文档进行比较,后者也清楚地说明了用例(强调我的):
用$injector注册一个常量服务,如字符串、数字、数组、对象或函数。像值一样,不可能将其他服务注入常量。
但与 value 不同的是,常量可以注入到模块配置函数中(参见 angular.Module),并且不能被 AngularJS 装饰器覆盖。
因此,AngularJS constant 函数没有提供字段中术语的通常理解含义的常量。
也就是说,对提供的对象施加的限制,以及它通过 $injector 更早的可用性,清楚地表明该名称是通过类比使用的。
如果你想在 AngularJS 应用程序中使用一个实际的常量,你可以像在任何 JavaScript 程序中一样“提供”一个
export const π = 3.14159265;
在 Angular 2 中,同样的技术也适用。
Angular 2 应用程序没有与 AngularJS 应用程序相同的配置阶段。此外,没有服务装饰器机制 (AngularJS Decorator),但考虑到它们之间的差异,这并不特别令人惊讶。
例子
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
是含糊的武断和有点令人反感,因为 $provide.constant 被用来指定一个对象,顺便说一下也是一个常量。你还不如写了
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
任何一个都可以改变。
现在关于可测试性的论点,嘲笑常数,被削弱了,因为它实际上并没有改变。
一个人不会嘲笑 π。
当然,您的应用程序特定语义可能是您的端点可能会更改,或者您的 API 可能具有不透明的故障转移机制,因此在某些情况下更改 API 端点是合理的。
但在这种情况下,将其作为单个 URL 的字符串文字表示提供给 constant 函数是行不通的。
一个更好的论点,可能更符合 AngularJS $provide.constant 函数存在的原因是,当 AngularJS 被引入时,JavaScript 没有 标准 模块概念。在这种情况下,全局变量将用于共享可变或不可变的值,并且使用全局变量是有问题的。
也就是说,通过框架提供这样的东西会增加与该框架的耦合。它还将 Angular 特定的逻辑与适用于任何其他系统的逻辑混合在一起。
这并不是说这是一种错误或有害的方法,但就个人而言,如果我想在 Angular 2 应用程序中使用 constant,我会写
export const π = 3.14159265;
就像我使用 AngularJS 一样。
变化越多……