Me gustaría que algunas variables fueran accesibles en todas partes en un Angular 2 en el lenguaje Typescript . ¿Cómo debo hacer para lograr esto?
Aquí está la solución más simple sin Service ni Observer :
Coloque las variables globales en un archivo y expórtelas.
// // ===== File globals.ts // 'use strict'; export const sep='/'; export const version: string="22.2.2"; Para usar globales en otro archivo, use una declaración de import : import * as myGlobals from 'globals';
Ejemplo:
// // ===== File heroes.component.ts // import {Component, OnInit} from 'angular2/core'; import {Router} from 'angular2/router'; import {HeroService} from './hero.service'; import {HeroDetailComponent} from './hero-detail.component'; import {Hero} from './hero'; import * as myGlobals from 'globals'; //<==== this one (**Updated**) export class HeroesComponent implements OnInit { public heroes: Hero[]; public selectedHero: Hero; // // // Here we access the global var reference. // public helloString: string="hello " + myGlobals.sep + " there"; ... } }Gracias @eric-martinez
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 convirtieran en verdaderas constantes. Si te interesa el tema, puedes leer este post .
// global.ts export const GlobalVariable = Object.freeze({ BASE_API_URL: 'http://example.com/', //... more of your variables });Consulte el módulo usando import.
//anotherfile.ts that refers to global constants import { GlobalVariable } from './path/global'; export class HeroService { private baseApiUrl = GlobalVariable.BASE_API_URL; //... more code }Un servicio compartido es el mejor enfoque
export class SharedService { globalVar:string; }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:
bootstrap(AppComponent, [SharedService]); Pero no volver a definirlo dentro de los atributos de providers de sus componentes:
@Component({ (...) providers: [ SharedService ], // No (...) })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 Angular 2:
Debe notar que también puede definir propiedades Observable en el servicio para notificar partes de su aplicación cuando cambien sus propiedades globales:
export class SharedService { globalVar:string; globalVarUpdate:Observable<string>; globalVarObserver:Observer; constructor() { this.globalVarUpdate = Observable.create((observer:Observer) => { this.globalVarObserver = observer; }); } updateGlobalVar(newValue:string) { this.globalVar = newValue; this.globalVarObserver.next(this.globalVar); } }Vea esta pregunta para más detalles: