Me gustaría que algunas variables para que sea accesible por todos lados en una Angular 2
en el Typescript
lenguaje. ¿Cómo debo hacer para lograr esto?
typescript
angular
supercobra
fuente
fuente
Uncaught ReferenceError: Settings is not defined
. La claseSettings
con variables públicas estáticas está configurada para exportar y ha importado donde solía.Respuestas:
Aquí está la solución más simple w o /
Service
niObserver
:Coloque las variables globales en un archivo y expórtelas.
Para usar globales en otro archivo, use una
import
declaración:import * as myGlobals from 'globals';
Ejemplo:
Gracias @ eric-martinez
fuente
import * as globs from 'globals'
export const
lugar deexport var
- realmente quieres asegurarte de que esas variables globales no puedan cambiarseimport * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
También me gusta la solución de @supercobra. Solo me gustaría mejorarlo un poco. Si exporta un objeto que contiene todas las constantes, simplemente puede usar es6 para importar el módulo sin usar require .
También usé Object.freeze para hacer que las propiedades se conviertan en constantes verdaderas. Si está interesado en el tema, puede leer esta publicación .
Consulte el módulo utilizando importación.
fuente
Un servicio compartido es el mejor enfoque
Pero debe tener mucho cuidado al registrarlo para poder compartir una sola instancia para toda su aplicación. Debe definirlo al registrar su aplicación:
pero no para definirlo nuevamente dentro de los
providers
atributos de sus componentes:De lo contrario, se creará una nueva instancia de su servicio para el componente y sus subcomponentes.
Puede echar un vistazo a esta pregunta sobre cómo funcionan la inyección de dependencia y los inyectores jerárquicos en Angular2:
Puede observar que también puede definir
Observable
propiedades en el servicio para notificar partes de su aplicación cuando cambian sus propiedades globales:Vea esta pregunta para más detalles:
fuente
HTTP_PROVIDERS
y similares, tampoco deberían agregarsebootstrap()
?bootstrap()
pero en la práctica no importa. Creo que enumerarlosboostrap()
hace que el código sea más fácil de entender. Un componente tiene proveedores, directivas, una plantilla. Encuentro esto sobrecargado sin los proveedores globales enumerados allí también. Por eso lo prefierobootstrap()
.alert(globalVar)
resultados en un error.Ver por ejemplo Angular 2 - Implementación de servicios compartidos
o proporcionar valores individuales
fuente
bootstrap()
.bootstrap()
y el componente raíz son dos cosas diferentes. Cuando llamabootstrap(AppComponent, [MyService])
, registra el servicioboostrap()
yAppComponent
es el componente raíz. Los documentos mencionan en alguna parte que es preferible registrar proveedores (servicio) en los componentes raíz,providers: ['MyService']
pero todavía no he encontrado ningún argumento a favor o en contra delbootstrap()
componente raíz.Crear clase global en app / globals.ts :
En su componente:
Nota : Puede agregar el proveedor de servicios Globals directamente al módulo en lugar del componente, y no necesitará agregarlo como proveedor a cada componente de ese módulo.
fuente
Globals
con agregarlo tambiénproviders: [ ... ]
significa que no puede cambiar un valor dentro de un componente y luego solicitar el valor actualizado dentro de un segundo componente. Cada vez que se inyectaGlobals
es una instancia nueva. Si desea cambiar este comportamiento, simplemente NO agregueGlobals
como proveedor.@Injectable()
En mi humilde opinión para Angular2 (v2.2.3), la mejor manera es agregar servicios que contengan la variable global e inyectarlos en componentes sin la
providers
etiqueta dentro del@Component
anotación. De esta manera, puede compartir información entre componentes.Un servicio de muestra que posee una variable global:
Un componente de muestra que actualiza el valor de su variable global:
Un componente de muestra que lee el valor de su variable global:
fuente
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
el archivo del módulo principal. Gracias.No sé la mejor manera, pero la manera más fácil si desea definir una variable global dentro de un componente es usar una
window
variable para escribir así:window.GlobalVariable = "what ever!"
no necesita pasarlo a bootstrap o importarlo a otros lugares, y es accesible globalmente a todos los JS (no solo a los componentes angulares 2).
fuente
Así es como lo uso:
global.ts
para usarlo solo importa así:
EDITADO: Droped "_" con el prefijo recomendado.
fuente
Creo que la mejor manera es compartir un objeto con variables globales en toda su aplicación exportándolo e importándolo donde lo desee.
Primero cree un nuevo archivo .ts , por ejemplo globals.ts y declare un objeto. Le di un tipo de objeto, pero también podría usar cualquier tipo o {}
Después de eso importalo
Y úsalo
fuente
Me gusta la respuesta de @supercobra, pero usaría la palabra clave const como está en ES6 ya disponible:
fuente