AngularJS's module.constant
ne définit pas de constante au sens standard.
Bien qu'il soit autonome en tant que mécanisme d'enregistrement de fournisseur, il est mieux compris dans le contexte de la fonction connexe module.value
( $provide.value
). La documentation officielle indique clairement le cas d'utilisation:
Enregistrez un service de valeur avec l'injecteur $, tel qu'une chaîne, un nombre, un tableau, un objet ou une fonction. C'est l'abréviation d'enregistrer un service où la propriété $ get de son fournisseur est une fonction d'usine qui ne prend aucun argument et renvoie la valeur service. Cela signifie également qu'il n'est pas possible d'injecter d'autres services dans un service de valeur.
Comparez cela à la documentation de module.constant
( $provide.constant
) qui indique également clairement le cas d'utilisation (c'est moi qui souligne):
Enregistrez un service constant avec l'injecteur $, tel qu'une chaîne, un nombre, un tableau, un objet ou une fonction. Comme la valeur, il n'est pas possible d'injecter d'autres services dans une constante. Mais contrairement à la valeur, une constante peut être injectée dans une fonction de configuration de module (voir angular.Module) et elle ne peut pas être remplacée par un décorateur AngularJS .
Par conséquent, la constant
fonction AngularJS ne fournit pas une constante dans le sens communément compris du terme dans le domaine.
Cela dit, les restrictions imposées à l'objet fourni, ainsi que sa disponibilité antérieure via l'injecteur $, suggèrent clairement que le nom est utilisé par analogie.
Si vous vouliez une constante réelle dans une application AngularJS, vous en fourniriez une de la même manière que dans n'importe quel programme JavaScript qui est
export const π = 3.14159265;
Dans Angular 2, la même technique est applicable.
Les applications Angular 2 n'ont pas de phase de configuration au même sens que les applications AngularJS. De plus, il n'y a pas de mécanisme de décorateur de service ( AngularJS Decorator ) mais cela n'est pas particulièrement surprenant étant donné leur différence.
L'exemple de
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
est vaguement arbitraire et légèrement rebutant car il $provide.constant
est utilisé pour spécifier un objet qui est d' ailleurs également une constante. Vous pourriez aussi bien avoir écrit
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
car tout le monde peut changer.
Maintenant, l'argument de la testabilité, se moquant de la constante, est diminué car il ne change littéralement pas.
On ne se moque pas de π.
Bien sûr, la sémantique spécifique à votre application pourrait être que votre point de terminaison pourrait changer, ou votre API pourrait avoir un mécanisme de basculement non transparent, il serait donc raisonnable que le point de terminaison de l'API change dans certaines circonstances.
Mais dans ce cas, la fournir sous la forme d'une représentation littérale sous forme de chaîne d'une URL unique vers la constant
fonction n'aurait pas fonctionné.
Un meilleur argument, et probablement plus conforme à la raison de l'existence de la $provide.constant
fonction AngularJS , est que, lorsque AngularJS a été introduit, JavaScript n'avait pas de concept de module standard . Dans ce cas, les globaux seraient utilisés pour partager des valeurs, mutables ou immuables, et l'utilisation des globaux est problématique.
Cela dit, fournir quelque chose comme ça via un cadre augmente le couplage avec ce cadre. Il mélange également une logique spécifique angulaire avec une logique qui fonctionnerait dans tout autre système.
Cela ne veut pas dire que c'est une approche erronée ou nuisible, mais personnellement, si je veux une constante dans une application Angular 2, j'écrirai
export const π = 3.14159265;
tout comme je l'aurais fait si j'utilisais AngularJS.
Plus les choses changent...
AppSettings
classe devrait être abstraite et leAPI_ENDPOINT
membre devrait l'êtrereadonly
.