O AngularJS module.constant
não define uma constante no sentido padrão.
Embora ele próprio seja um mecanismo de registro de provedor, ele é melhor compreendido no contexto da função related module.value
( $provide.value
). A documentação oficial indica claramente o caso de uso:
Registre um serviço de valor com o injetor $, como uma string, um número, uma matriz, um objeto ou uma função. É a abreviação de registrar um serviço em que a propriedade $ get do provedor é uma função de fábrica que não aceita argumentos e retorna o serviço de valor. Isso também significa que não é possível injetar outros serviços em um serviço de valor.
Compare isso com a documentação de module.constant
( $provide.constant
), que também indica claramente o caso de uso (ênfase meu):
Registre um serviço constante com o injetor $, como uma string, um número, uma matriz, um objeto ou uma função. Como o valor, não é possível injetar outros serviços em uma constante. Porém, diferentemente do valor, uma constante pode ser injetada em uma função de configuração do módulo (consulte angular.Module) e não pode ser substituída por um decorador do AngularJS .
Portanto, a constant
função AngularJS não fornece uma constante no significado comumente entendido do termo no campo.
Dito isto, as restrições impostas ao objeto fornecido, juntamente com sua disponibilidade anterior via injetor $, sugerem claramente que o nome é usado por analogia.
Se você quisesse uma constante real em um aplicativo AngularJS, "forneceria" uma da mesma maneira que faria em qualquer programa JavaScript que seja
export const π = 3.14159265;
No Angular 2, a mesma técnica é aplicável.
Os aplicativos Angular 2 não possuem uma fase de configuração no mesmo sentido que os aplicativos AngularJS. Além disso, não há mecanismo de decorador de serviço ( AngularJS Decorator ), mas isso não é particularmente surpreendente, considerando a diferença entre eles.
O exemplo de
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
é vagamente arbitrário e um pouco desanimador, porque $provide.constant
está sendo usado para especificar um objeto que, aliás, também é uma constante. Você também pode ter escrito
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
pois todos podem mudar.
Agora, o argumento da testabilidade, zombando da constante, diminui porque literalmente não muda.
Não se zomba de π.
É claro que a semântica específica de seu aplicativo pode ser que seu terminal possa mudar ou sua API possa ter um mecanismo de failover não transparente, portanto, seria razoável que o terminal da API fosse alterado sob determinadas circunstâncias.
Mas, nesse caso, fornecê-lo como uma representação literal de cadeia de caracteres de um único URL para a constant
função não teria funcionado.
Um argumento melhor e provavelmente mais um alinhado com a razão da existência da $provide.constant
função AngularJS é que, quando o AngularJS foi introduzido, o JavaScript não tinha um conceito de módulo padrão . Nesse caso, os globais seriam usados para compartilhar valores, mutáveis ou imutáveis, e o uso de globais é problemático.
Dito isto, fornecer algo assim através de uma estrutura aumenta o acoplamento a essa estrutura. Também combina lógica específica angular com lógica que funcionaria em qualquer outro sistema.
Isso não quer dizer que seja uma abordagem errada ou prejudicial, mas pessoalmente, se eu quiser uma constante em um aplicativo Angular 2, escreverei
export const π = 3.14159265;
exatamente como eu teria usado o AngularJS.
Quanto mais as coisas mudam ...
AppSettings
classe deve ser abstrata eAPI_ENDPOINT
membro deve serreadonly
.