如何在Angular 2 / Typescript中声明全局变量?

时间:2016-03-22 15:40:44

标签: typescript angular

我希望在Angular 2语言的Typescript中随处可以访问某些变量。我该怎么做呢?

10 个答案:

答案 0 :(得分:174)

这是最简单的解决方案,无ServiceObserver

将全局变量放在文件中并导出它们。

//
// ===== File globals.ts    
//
'use strict';

export const sep='/';
export const version: string="22.2.2";    

要在另一个文件中使用全局变量,请使用import语句: import * as myGlobals from './globals';

示例:

// 
// ===== 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";

         ...

        }
    }

谢谢@ eric-martinez

答案 1 :(得分:81)

我也喜欢@supercobra的解决方案。 我只是想略微改进它。如果导出包含所有常量的对象,则只需使用es6 导入模块而不使用 require

我还使用Object.freeze使属性成为真正的常量。如果您对该主题感兴趣,可以阅读此post

// global.ts

 export const GlobalVariable = Object.freeze({
     BASE_API_URL: 'http://example.com/',
     //... more of your variables
 });

使用导入参考模块。

//anotherfile.ts that refers to global constants
import { GlobalVariable } from './path/global';

export class HeroService {
    private baseApiUrl = GlobalVariable.BASE_API_URL;

    //... more code
}

答案 2 :(得分:52)

共享服务是最好的方法

export class SharedService {
  globalVar:string;
}

但是在注册它时需要非常小心,以便能够为整个应用程序共享一个实例。您需要在注册应用程序时定义它:

bootstrap(AppComponent, [SharedService]);

但不要在组件的providers属性中再次定义它:

@Component({
  (...)
  providers: [ SharedService ], // No
  (...)
})

否则,将为组件及其子组件创建新服务实例。

您可以查看有关依赖注入和分层注入器如何在Angular2中工作的问题:

您可以注意到,您还可以在服务中定义Observable属性,以便在全局属性发生更改时通知应用程序的各个部分:

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);
  }
}

有关详细信息,请参阅此问题:

答案 3 :(得分:35)

参见例如Angular 2 - Implementation of shared services

@Injectable() 
export class MyGlobals {
  readonly myConfigValue:string = 'abc';
}

@NgModule({
  providers: [MyGlobals],
  ...
})

class MyComponent {
  constructor(private myGlobals:MyGlobals) {
    console.log(myGlobals.myConfigValue);
  }
}

或提供个人价值

@NgModule({
  providers: [{provide: 'myConfigValue', useValue: 'abc'}],
  ...
})

class MyComponent {
  constructor(@Inject('myConfigValue') private myConfigValue:string) {
    console.log(myConfigValue);
  }
}

答案 4 :(得分:15)

app / globals.ts 中创建Globals类:

import { Injectable } from '@angular/core';

Injectable()
export class Globals{
    VAR1 = 'value1';
    VAR2 = 'value2';
}

在您的组件中:

import { Globals } from './globals';

@Component({
    selector: 'my-app',
    providers: [ Globals ],
    template: `<h1>My Component {{globals.VAR1}}<h1/>`
})
export class AppComponent {
    constructor(private globals: Globals){
    }
}

注意:您可以将Globals服务提供商直接添加到模块而不是组件,您不需要将其作为提供者添加到该模块中的每个组件。

@NgModule({
    imports: [...],
    declarations: [...],
    providers: [ Globals ],
    bootstrap: [ AppComponent ]
})
export class AppModule {
}

答案 5 :(得分:11)

对于Angular2(v2.2.3)的IMHO,最好的方法是添加包含全局变量的服务,并将它们注入到providers注释中没有@Component标记的组件中。通过这种方式,您可以在组件之间共享信息。

拥有全局变量的示例服务:

import { Injectable } from '@angular/core'

@Injectable()
export class SomeSharedService {
  public globalVar = '';
}

更新全局变量值的示例组件:

import { SomeSharedService } from '../services/index';

@Component({
  templateUrl: '...'
})
export class UpdatingComponent {

  constructor(private someSharedService: SomeSharedService) { }

  updateValue() {
    this.someSharedService.globalVar = 'updated value';
  }
}

读取全局变量值的示例组件:

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
  }
}
  

请注意,providers: [ SomeSharedService ] 添加到您的@Component注释中。通过不添加此行注入将始终为您提供SomeSharedService的相同实例。如果添加该行,则会注入新创建的实例。

答案 6 :(得分:7)

我不知道最好的方法,但如果你想在组件内部定义一个全局变量,那么最简单的方法就是使用window变量来编写如下:

window.GlobalVariable = "what ever!"

你不需要将它传递给bootstrap或将其导入其他地方,并且它可以全局访问所有JS(不仅仅是角度2组件)。

答案 7 :(得分:5)

这就是我使用它的方式:

global.ts

export var server: string = 'http://localhost:4200/';
export var var2: number = 2;
export var var3: string = 'var3';

使用它只是导入:

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
}

EDITED: 根据建议将“_”作为前缀。

答案 8 :(得分:4)

我认为最好的方法是在整个应用程序中通过导出和导入全局变量来共享一个对象。

首先创建一个新的 .ts 文件,例如 globals.ts 并声明一个对象。我给了它一个对象类型,但你也可以使用any type or {}

export let globalVariables: Object = {
 version: '1.3.3.7',
 author: '0x1ad2',
 everything: 42
};

之后导入

import {globalVariables} from "path/to/your/globals.ts"

并使用它

console.log(globalVariables);

答案 9 :(得分:3)

我喜欢@supercobra的答案,但我会使用const关键字,因为它已经在ES6中可用了:

//
// ===== File globals.ts    
//
'use strict';

export const sep='/';
export const version: string="22.2.2";