AngularJS module.constant
non definisce una costante in senso standard.
Mentre si distingue da solo come meccanismo di registrazione del provider, è meglio compreso nel contesto della funzione related module.value
( $provide.value
). La documentazione ufficiale indica chiaramente il caso d'uso:
Registra un servizio valore con $ injector, come una stringa, un numero, un array, un oggetto o una funzione. Questo è abbreviato per la registrazione di un servizio in cui la proprietà $ get del suo provider è una funzione factory che non accetta argomenti e restituisce il servizio valore. Ciò significa anche che non è possibile iniettare altri servizi in un servizio di valore.
Confrontalo con la documentazione di module.constant
( $provide.constant
) che indica chiaramente anche il caso d'uso (enfasi sulla mia):
Registra un servizio costante con $ injector, come una stringa, un numero, un array, un oggetto o una funzione. Come il valore, non è possibile iniettare altri servizi in una costante. Ma a differenza del valore, una costante può essere iniettata in una funzione di configurazione del modulo (vedi angular.Module) e non può essere ignorata da un decoratore AngularJS .
Pertanto, la constant
funzione AngularJS non fornisce una costante nel significato comunemente compreso del termine nel campo.
Detto questo, le restrizioni poste sull'oggetto fornito, insieme alla sua precedente disponibilità tramite l'iniettore $, suggeriscono chiaramente che il nome è usato per analogia.
Se volessi una costante effettiva in un'applicazione AngularJS, "forniresti" uno come faresti in qualsiasi programma JavaScript che è
export const π = 3.14159265;
In Angular 2 è applicabile la stessa tecnica.
Le applicazioni Angular 2 non hanno una fase di configurazione nello stesso senso delle applicazioni AngularJS. Inoltre, non esiste alcun meccanismo di decoratore di servizi ( AngularJS Decorator ), ma ciò non sorprende particolarmente, dato quanto differiscono l'uno dall'altro.
L'esempio di
angular
.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/');
è vagamente arbitrario e leggermente scoraggiante perché $provide.constant
viene utilizzato per specificare un oggetto che per inciso è anche una costante. Potresti anche aver scritto
export const apiEndpoint = 'http://127.0.0.1:6666/api/';
perché tutti e due possono cambiare.
Ora l'argomento per la testabilità, deridendo la costante, è diminuito perché letteralmente non cambia.
Non si deride π.
Ovviamente la semantica specifica dell'applicazione potrebbe essere che il tuo endpoint potrebbe cambiare, o l'API potrebbe avere un meccanismo di failover non trasparente, quindi sarebbe ragionevole che l'endpoint API cambi in determinate circostanze.
Ma in quel caso, fornirlo come una rappresentazione letterale stringa di un singolo URL per la constant
funzione non avrebbe funzionato.
Un argomento migliore, e probabilmente un altro in linea con il motivo dell'esistenza della $provide.constant
funzione AngularJS , è che, quando fu introdotto AngularJS, JavaScript non aveva un concetto di modulo standard . In tal caso, i globali verrebbero usati per condividere valori, mutabili o immutabili, e l'uso dei globali è problematico.
Detto questo, fornire qualcosa di simile attraverso un framework aumenta l'accoppiamento con quel framework. Mescola anche la logica angolare specifica con la logica che funzionerebbe in qualsiasi altro sistema.
Questo non vuol dire che è un approccio sbagliato o dannoso, ma personalmente, se voglio una costante in un'applicazione Angular 2, scriverò
export const π = 3.14159265;
proprio come avrei usato AngularJS.
Più cose cambiano ...
AppSettings
classe dovrebbe essere astratta e ilAPI_ENDPOINT
membro dovrebbe esserloreadonly
.