typescript - variable - constantes en angular 4
¿Cómo puedo declarar una variable global en Angular 2/Typecript? (10)
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 globals en otro archivo, use una declaración de
import * as myGlobals from ''./globals'';
:
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
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
Me gustaría que algunas variables sean accesibles en todas partes en un
Angular 2
en el lenguaje
Typescript
.
¿Cómo debo hacer para lograr esto?
Así es como lo uso:
global.ts
export var server: string = ''http://localhost:4200/'';
export var var2: number = 2;
export var var3: string = ''var3'';
para usarlo solo importa así:
import { Injectable } from ''@angular/core'';
import { Http, Headers, RequestOptions } from ''@angular/http'';
import { Observable } from ''rxjs/Rx'';
import * as glob from ''../shared/global''; //<== HERE
@Injectable()
export class AuthService {
private AuhtorizationServer = glob.server
}
EDITADO: Se dejó caer "_" con el prefijo recomendado.
Cree la clase Globals en app / globals.ts :
import { Injectable } from ''@angular/core'';
Injectable()
export class Globals{
VAR1 = ''value1'';
VAR2 = ''value2'';
}
En su componente:
import { Globals } from ''./globals'';
@Component({
selector: ''my-app'',
providers: [ Globals ],
template: `<h1>My Component {{globals.VAR1}}<h1/>`
})
export class AppComponent {
constructor(private globals: Globals){
}
}
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.
@NgModule({
imports: [...],
declarations: [...],
providers: [ Globals ],
bootstrap: [ AppComponent ]
})
export class AppModule {
}
Creo que la mejor manera es compartir un objeto con variables globales a lo largo de su aplicación exportándolo e importándolo donde 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 {}
export let globalVariables: Object = {
version: ''1.3.3.7'',
author: ''0x1ad2'',
everything: 42
};
Después de eso importalo
import {globalVariables} from "path/to/your/globals.ts"
Y úsalo
console.log(globalVariables);
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 etiqueta de
providers
dentro de la anotación
@Component
.
De esta manera, puede compartir información entre componentes.
Un servicio de muestra que posee una variable global:
import { Injectable } from ''@angular/core''
@Injectable()
export class SomeSharedService {
public globalVar = '''';
}
Un componente de muestra que actualiza el valor de su variable global:
import { SomeSharedService } from ''../services/index'';
@Component({
templateUrl: ''...''
})
export class UpdatingComponent {
constructor(private someSharedService: SomeSharedService) { }
updateValue() {
this.someSharedService.globalVar = ''updated value'';
}
}
Un componente de muestra que lee el valor de su variable global:
import { SomeSharedService } from ''../services/index'';
@Component({
templateUrl: ''...''
})
export class ReadingComponent {
constructor(private someSharedService: SomeSharedService) { }
readValue() {
let valueReadOut = this.someSharedService.globalVar;
// do something with the value read out
}
}
Tenga en cuenta que los
providers: [ SomeSharedService ]
no deben agregarse a su anotación@Component
. Al no agregar esta línea, la inyección siempre le dará la misma instancia deSomeSharedService
. Si agrega la línea, se inyecta una instancia recién creada.
Me gusta la respuesta de @supercobra, pero usaría la palabra clave const como está en ES6 ya disponible:
//
// ===== File globals.ts
//
''use strict'';
export const sep=''/'';
export const version: string="22.2.2";
No sé la mejor manera, pero la manera más fácil si desea definir una variable global dentro de un componente es usar la variable de
window
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).
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 post .
// global.ts
export const GlobalVariable = Object.freeze({
BASE_API_URL: ''http://example.com/'',
//... more of your variables
});
Consulte el módulo utilizando importación.
//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 para definirlo nuevamente dentro de los atributos de los
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 Angular2:
Puede observar que también puede definir propiedades
Observable
en el servicio para notificar partes de su aplicación cuando cambian 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:
Ver por ejemplo Angular 2 - Implementación de servicios compartidos
@Injectable()
export class MyGlobals {
readonly myConfigValue:string = ''abc'';
}
@NgModule({
providers: [MyGlobals],
...
})
class MyComponent {
constructor(private myGlobals:MyGlobals) {
console.log(myGlobals.myConfigValue);
}
}
o proporcionar valores individuales
@NgModule({
providers: [{provide: ''myConfigValue'', useValue: ''abc''}],
...
})
class MyComponent {
constructor(@Inject(''myConfigValue'') private myConfigValue:string) {
console.log(myConfigValue);
}
}