Quelle est la meilleure façon de déclarer une variable globale en Angular 2 / dactylographié [fermé]
j'aimerais que certaines variables soient accessibles partout dans un Angular 2
dans la langue Typescript
. Quelle est la meilleure façon de le faire?
10 réponses
Voici la solution la plus simple w / o Service
nor Observer
:
Mettre les variables globales dans un fichier d'exportation.
//
// ===== File globals.ts
//
'use strict';
export const sep='/';
export const version: string="22.2.2";
pour utiliser des globals dans un autre fichier utilisez une déclaration import
:
import * as myGlobals from './globals';
exemple:
//
// ===== 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";
...
}
}
merci @ eric-martinez
j'aime aussi la solution de @supercobra. J'aimerais juste l'améliorer un peu. Si vous exportez un objet qui contient toutes les constantes, vous pouvez simplement utiliser es6 importer le module sans utiliser require .
j'ai aussi utilisé L'objet.figer pour faire les propriétés deviennent de vraies constantes. Si vous êtes intéressé par le sujet, vous pouvez lire ce post .
// global.ts
export const GlobalVariable = Object.freeze({
BASE_API_URL: 'http://example.com/',
//... more of your variables
});
Consulter le module à l'aide d'importation.
//anotherfile.ts that refers to global constants
import { GlobalVariable } from './path/global';
export class HeroService {
private baseApiUrl = GlobalVariable.BASE_API_URL;
//... more code
}
un service partagé est la meilleure approche
export class SharedService {
globalVar:string;
}
mais vous devez être très prudent lors de l'enregistrement pour pouvoir partager une seule instance pour l'ensemble de votre application. Vous devez le définir lors de l'enregistrement de votre demande:
bootstrap(AppComponent, [SharedService]);
mais de ne pas le définir à nouveau dans les attributs providers
de vos composants:
@Component({
(...)
providers: [ SharedService ], // No
(...)
})
sinon une nouvelle instance de votre service sera créée pour la composante et ses sous-composantes.
vous pouvez jeter un oeil à cette question concernant la façon dont l'injection de dépendance et les injecteurs hiérarchiques fonctionnent en Angular2:
vous pouvez noter que vous pouvez également définir Observable
propriétés dans le service de notifier des parties de votre application lorsque votre propriétés globales du changement:
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);
}
}
voir cette question pour plus de détails:
Voir, par exemple, Angulaire 2 - mise en Œuvre des services partagés
@Injectable()
export class MyGlobals {
readonly myConfigValue:string = 'abc';
}
@NgModule({
providers: [MyGlobals],
...
})
class MyComponent {
constructor(private myGlobals:MyGlobals) {
console.log(myGlobals.myConfigValue);
}
}
ou fournir des valeurs individuelles
@NgModule({
providers: [{provide: 'myConfigValue', useValue: 'abc'}],
...
})
class MyComponent {
constructor(@Inject('myConfigValue') private myConfigValue:string) {
console.log(myConfigValue);
}
}
Créer une classe Globals app/globals.ts :
import { Injectable } from '@angular/core';
Injectable()
export class Globals{
VAR1 = 'value1';
VAR2 = 'value2';
}
dans votre composant:
import { Globals } from './globals';
@Component({
selector: 'my-app',
providers: [ Globals ],
template: `<h1>My Component {{globals.VAR1}}<h1/>`
})
export class AppComponent {
constructor(private globals: Globals){
}
}
Note : vous pouvez ajouter Globals service provider directement au module au lieu du composant, et vous n'aurez pas besoin d'ajouter en tant que fournisseur à chaque composant de ce module.
@NgModule({
imports: [...],
declarations: [...],
providers: [ Globals ],
bootstrap: [ AppComponent ]
})
export class AppModule {
}
IMHO for Angular2 (v2.2.3) la meilleure façon est d'ajouter des services qui contiennent la variable globale et de les injecter dans des composants sans la balise providers
à l'intérieur de l'annotation @Component
. Par cette façon, vous êtes en mesure de partager des informations entre les composants.
Un exemple de service qui propriétaire "de 1519120920" une variable globale:
import { Injectable } from '@angular/core'
@Injectable()
export class SomeSharedService {
public globalVar = '';
}
un composant d'échantillon que met à jour la valeur de votre global variable:
import { SomeSharedService } from '../services/index';
@Component({
templateUrl: '...'
})
export class UpdatingComponent {
constructor(private someSharedService: SomeSharedService) { }
updateValue() {
this.someSharedService.globalVar = 'updated value';
}
}
un composant d'échantillon qui se lit la valeur de votre variable globale:
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
}
}
notez que
providers: [ SomeSharedService ]
devrait et non être ajouté à votre annotation@Component
. En n'ajoutant pas cette ligne, l'injection vous donnera toujours la même instance deSomeSharedService
. Si vous ajoutez la ligne une instance fraîchement créée est injectée.
Je ne sais pas la meilleure façon, mais la plus simple si vous voulez définir une variable globale à l'intérieur d'un composant est d'utiliser window
variable pour écrire comme ceci:
window.GlobalVariable = "what ever!"
vous n'avez pas besoin de le passer pour bootstrap ou l'importer d'autres endroits, et il est globalement accessible à tous les js (non seulement angular 2 components).
C'est la façon dont je l'utilise:
global.ts
export var server: string = 'http://localhost:4200/';
export var var2 : number = 2;
export var var3 : string = 'var3';
pour l'utiliser il suffit d'importer comme ça:
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
}
édité: Larguaient "_" préfixe tel que recommandé.
je pense que le meilleur moyen est de partager un objet avec des variables globales tout au long de votre application en l'exportant et en l'important où vous voulez.
créer D'abord un nouveau .ts fichier par exemple globals.ts et déclarer un objet. Je lui ai donné un objet type, mais vous pouvez également utiliser un tout type ou {}
export let globalVariables: Object = {
version: '1.3.3.7',
author: '0x1ad2',
everything: 42
};
Après que l'importer
import {globalVariables} from "path/to/your/globals.ts"
et l'utiliser
console.log(globalVariables);
j'aime la réponse de @supercobra, mais je voudrais utiliser le mot-clé const comme il est dans ES6 déjà disponible:
//
// ===== File globals.ts
//
'use strict';
export const sep='/';
export const version: string="22.2.2";