Me gustaría que algunas variables para que sea accesible por todos lados en una Angular 2en el Typescriptlenguaje. ¿Cómo debo hacer para lograr esto?
typescript
angular
supercobra
fuente
fuente

Uncaught ReferenceError: Settings is not defined. La claseSettingscon 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 /
ServiceniObserver:Coloque las variables globales en un archivo y expórtelas.
Para usar globales en otro archivo, use una
importdeclaración:import * as myGlobals from 'globals';Ejemplo:
Gracias @ eric-martinez
fuente
import * as globs from 'globals'export constlugar 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
providersatributos 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
Observablepropiedades en el servicio para notificar partes de su aplicación cuando cambian sus propiedades globales:Vea esta pregunta para más detalles:
fuente
HTTP_PROVIDERSy 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()yAppComponentes 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
Globalscon 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 inyectaGlobalses una instancia nueva. Si desea cambiar este comportamiento, simplemente NO agregueGlobalscomo 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
providersetiqueta dentro del@Componentanotació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 SomeSharedServiceproviders: [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
windowvariable 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