En Angular 1.x puede definir constantes como esta:
angular.module('mainApp.config', [])
.constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')
¿Cuál sería el equivalente en angular (con TypeScript)?
Simplemente no quiero repetir la URL base API una y otra vez en todos mis servicios.
typescript
angular
AndreFeijo
fuente
fuente
AppSettings
clase debería ser abstracta y elAPI_ENDPOINT
miembro debería serloreadonly
.La solución para la configuración proporcionada por el propio equipo angular se puede encontrar aquí. .
Aquí está todo el código relevante:
1) app.config.ts
2) app.module.ts
3) your.service.ts
Ahora puede inyectar la configuración en todas partes sin usar los nombres de cadena y con el uso de su interfaz para verificaciones estáticas.
Por supuesto, puede separar la interfaz y la constante para poder suministrar diferentes valores en producción y desarrollo, por ejemplo
fuente
environment.ts
yenvironment.prod.ts
para que pueda tener diferentes constantes por entorno? @IlyaChernomordik comenzó a mencionar esto en el último párrafo de su respuesta.En Angular2, tiene la siguiente proporcionan definición, que le permite configurar diferentes tipos de dependencias:
Comparando con Angular 1
app.service
en Angular1 es equivalente auseClass
en Angular2.app.factory
en Angular1 es equivalente auseFactory
en Angular2.app.constant
yapp.value
se ha simplificadouseValue
con menos restricciones. es decir, ya no hayconfig
bloque.app.provider
- No hay equivalente en Angular 2.Ejemplos
Para configurar con el inyector raíz:
O configure con el inyector de su componente:
provide
es mano corta para:Con el inyector, obtener el valor es fácil:
fuente
En Angular 4, puede usar la clase de entorno para mantener todos sus globales.
Tiene environment.ts y environment.prod.ts de forma predeterminada.
Por ejemplo
Y luego en su servicio:
fuente
const
interior de un servicio, puede que tenga que "proporcionar" se ordenaron los proveedores de su módulo de aplicación:{ provide: 'ConstName', useValue: ConstName }
. Estaba recibiendo un error de tiempo de ejecución sin esto.Actualizado para Angular 4+
Ahora podemos simplemente usar el archivo de entornos que angular proporciona valor predeterminado si su proyecto se genera a través de angular-cli.
por ejemplo
En su carpeta de entornos, cree los siguientes archivos
environment.prod.ts
environment.qa.ts
environment.dev.ts
y cada archivo puede contener cambios de código relacionados, tales como:
environment.prod.ts
environment.qa.ts
environment.dev.ts
Caso de uso en la aplicación
Puede importar entornos en cualquier archivo, como servicios
clientUtilServices.ts
import {environment} from '../../environments/environment';
Caso de uso en construcción
Abra su archivo CLI angular
.angular-cli.json
y"apps": [{...}]
agregue el siguiente códigoSi desea compilar para producción, ejecútelo
ng build --env=prod
para leer la configuraciónenvironment.prod.ts
, de la misma manera que puede hacerloqa
odev
## Respuesta anterior
He estado haciendo algo como a continuación, en mi proveedor:
Entonces tengo acceso a todos los datos de Constant en cualquier lugar
fuente
API_ENDPOINT
valor puede sobrescribirse en cualquier momento. Sithis.ConstantService.API_ENDPOINT = 'blah blah'
se declara en la clase en cualquier momento después de que su llamada "constante" se importe desdeconstant-service
, el nuevo valor de API_ENDPOINT sería'blah blah'
. Su solución solo muestra cómo acceder a una variable utilizando un servicio y no utilizando una constante.readonly API_ENDPOINT :String;
ng build --env=prod
Si bien el enfoque de tener una clase AppSettings con una cadena constante mientras ApiEndpoint funciona, no es ideal ya que no podríamos intercambiar este ApiEndpoint real por otros valores en el momento de la prueba unitaria.
Necesitamos poder inyectar estos puntos finales de la API en nuestros servicios (piense en inyectar un servicio en otro servicio). Tampoco necesitamos crear una clase completa para esto, todo lo que queremos hacer es inyectar una cadena en nuestros servicios siendo nuestro ApiEndpoint. Para completar la excelente respuesta por pixelbits , aquí está el código completo de cómo se puede hacer en Angular 2:
Primero, debemos decirle a Angular cómo proporcionar una instancia de nuestro ApiEndpoint cuando lo solicitamos en nuestra aplicación (piense en ello como el registro de una dependencia):
Y luego, en el servicio que inyectamos este ApiEndpoint al constructor servicio y angular proporcionaremos por nosotros en base a nuestro registro anterior:
fuente
Esta es mi experiencia reciente con este escenario:
He seguido los documentos oficiales y actualizados aquí:
https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens
Parece que OpaqueToken ahora está en desuso y debemos usar InjectionToken , por lo que estos son mis archivos que se ejecutan como un encanto:
app-config.interface.ts
app-config.constants.ts
app.module.ts
my-service.service.ts
El resultado es limpio y no hay advertencias en la consola, gracias al reciente comentario de John Papa en este número:
https://github.com/angular/angular-cli/issues/2034
La clave fue implementar en un archivo diferente la interfaz.
fuente
Todas las soluciones parecen ser complicadas. Estoy buscando la solución más simple para este caso y solo quiero usar constantes. Las constantes son simples. ¿Hay algo que hable en contra de la siguiente solución?
app.const.ts
app.service.ts
fuente
Simplemente use una constante de Typecript
Puede usarlo en el inyector de dependencia usando
fuente
const
yestSi estás usando Webpack , que recomiendo, puede configurar constantes para diferentes entornos. Esto es especialmente valioso cuando tiene valores constantes diferentes para cada entorno.
Es probable que tenga varios archivos webpack en su
/config
directorio (por ejemplo, webpack.dev.js, webpack.prod.js, etc.). Entonces tendrás uncustom-typings.d.ts
agregarás allí. Aquí está el patrón general a seguir en cada archivo y un uso de muestra en un Componente.paquete web. {env} .js
custom-typings.d.ts
Componente
fuente
Usar un archivo de propiedades que se genera durante una compilación es simple y fácil. Este es el enfoque que utiliza la CLI angular. Defina un archivo de propiedades para cada entorno y use un comando durante la compilación para determinar qué archivo se copia en su aplicación. Luego, simplemente importe el archivo de propiedades para usar.
https://github.com/angular/angular-cli#build-targets-and-environment-files
fuente
Un enfoque para Angular4 sería definir una constante a nivel de módulo:
Entonces, a su servicio:
fuente
Tengo otra forma de definir constantes globales. Porque si definimos en el archivo ts, si compilamos en modo de producción, no es fácil encontrar constantes para cambiar el valor.
En la carpeta de la aplicación, agrego la carpeta configs / setting.json
Contenido en setting.json
En el módulo de la aplicación, agregue APP_INITIALIZER
De esta manera, puedo cambiar el valor en el archivo json más fácilmente. También lo uso para mensajes de error / advertencia constantes.
fuente
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:Compare esto con la documentación de
module.constant
($provide.constant
) que también establece claramente el caso de uso (énfasis mío):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
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
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 escritopara 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é
tal como lo hubiera hecho si estuviera usando AngularJS.
Los más cambian las cosas...
fuente
La mejor manera de crear constantes de aplicación amplia en Angular 2 es mediante el uso de archivos environment.ts. La ventaja de declarar tales constantes es que puede variarlas según el entorno, ya que puede haber un archivo de entorno diferente para cada entorno.
fuente
Puede crear una clase para su variable global y luego exportar esta clase así:
Después de crear y exportar su
CONSTANT
clase, debe importar esta clase en la clase que desea usar, de esta manera:Puede usar esto en
constructor
ongOnInit(){}
, o en cualquier método predefinido.fuente