AngularJS's module.constant
no define una constante en el sentido estándar.
Si bien se destaca como mecanismo de registro de proveedores, se entiende mejor en el contexto de la función relacionada module.value
( $provide.value
). La documentación oficial establece claramente el caso de uso:
Registre un servicio de valor con el inyector $, como una cadena, un número, una matriz, un objeto o una función. Esto es la abreviatura de registrar un servicio donde la propiedad $ get de su proveedor es una función de fábrica que no toma argumentos y devuelve el servicio de valor. Eso también significa que no es posible inyectar otros servicios en un servicio de valor.
Compare esto con la documentación de module.constant
( $provide.constant
) que también establece claramente el caso de uso (énfasis mío):
Registre un servicio constante con el inyector $, como una cadena, un número, una matriz, un objeto o una función. Al igual que el valor, no es posible inyectar otros servicios en una constante. Pero a diferencia del valor, una constante puede inyectarse en una función de configuración del módulo (ver angular.Module) y no puede ser anulada por un decorador AngularJS .
Por lo tanto, la constant
función AngularJS no proporciona una constante en el significado comúnmente entendido del término en el campo.
Dicho esto, las restricciones impuestas al objeto proporcionado, junto con su disponibilidad anterior a través del inyector $, sugieren claramente que el nombre se usa por analogía.
Si quisiera una constante real en una aplicación AngularJS, "proporcionaría" una de la misma manera que lo haría en cualquier programa JavaScript que sea
export const π = 3.14159265;
En Angular 2, se aplica la misma técnica.
Las aplicaciones de Angular 2 no tienen una fase de configuración en el mismo sentido que las aplicaciones de AngularJS. Además, no existe un mecanismo de decorador de servicios ( AngularJS Decorator ), pero esto no es particularmente sorprendente dado lo diferentes que son entre sí.
El ejemplo de
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
es vagamente arbitrario y ligeramente desagradable porque $provide.constant
se usa para especificar un objeto que, por cierto, también es una constante. También podrías haber escrito
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
para todos tampoco puede cambiar.
Ahora el argumento a favor de la capacidad de prueba, burlándose de la constante, disminuye porque literalmente no cambia.
Uno no se burla de π.
Por supuesto, la semántica específica de su aplicación podría ser que su punto final podría cambiar, o su API podría tener un mecanismo de conmutación por error no transparente, por lo que sería razonable que el punto final de la API cambie bajo ciertas circunstancias.
Pero en ese caso, proporcionarlo como una representación literal de cadena de una única URL a la constant
función no habría funcionado.
Un mejor argumento, y probablemente uno más alineado con la razón de la existencia de la $provide.constant
función AngularJS es que, cuando se introdujo AngularJS, JavaScript no tenía concepto de módulo estándar . En ese caso, los globales se usarían para compartir valores, mutables o inmutables, y el uso de globales es problemático.
Dicho esto, proporcionar algo como esto a través de un marco aumenta el acoplamiento a ese marco. También combina lógica angular específica con lógica que funcionaría en cualquier otro sistema.
Esto no quiere decir que sea un enfoque incorrecto o dañino, pero personalmente, si quiero una constante en una aplicación Angular 2, escribiré
export const π = 3.14159265;
tal como lo hubiera hecho si estuviera usando AngularJS.
Los más cambian las cosas...
AppSettings
clase debería ser abstracta y elAPI_ENDPOINT
miembro debería serloreadonly
.