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?

123
demandé sur vusan 2016-03-22 18:40:43

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

155
répondu supercobra 2017-05-06 05:13:36

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
}
74
répondu Tim Hong 2017-04-02 03:38:08

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:

47
répondu Thierry Templier 2017-05-23 12:18:36

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);
  }
}
29
répondu Günter Zöchbauer 2018-02-15 14:46:45

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 {
}
13
répondu gradosevic 2016-10-09 18:28:31

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 de SomeSharedService . Si vous ajoutez la ligne une instance fraîchement créée est injectée.

10
répondu Timo Bähr 2017-01-23 14:55:30

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).

6
répondu Mahdi Jadaliha 2016-06-30 17:16:54

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é.

4
répondu Guilherme Teubl 2016-10-04 15:30:44

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);
4
répondu 0x1ad2 2017-05-23 11:33:26

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"; 
3
répondu Zolcsi 2016-07-20 11:50:23