IT박스

Angular 2 / Typescript에서 전역 변수를 어떻게 선언 할 수 있습니까?

itboxs 2020. 6. 5. 21:08
반응형

Angular 2 / Typescript에서 전역 변수를 어떻게 선언 할 수 있습니까? [닫은]


나는 도처에 액세스 할 수 있도록 몇 가지 변수를 원하는 Angular 2Typescript언어. 이것을 달성하려면 어떻게해야합니까?


여기 / O w 간단한 해결책이 Service아니다는 Observer:

전역 변수를 파일에 넣고 내보내십시오.

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


@supercobra의 솔루션도 좋아합니다. 그냥 약간 개선하고 싶습니다. 모든 상수가 포함 된 객체를 내보내는 경우 require 를 사용하지 않고 es6 import 모듈을 사용하면 됩니다.

또한 Object.freeze를 사용하여 속성을 진정한 상수로 만들었습니다. 당신이 주제에 관심이 있다면, 당신은이 게시물을 읽을 수 있습니다.

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

공유 서비스가 최선의 방법입니다

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

자세한 내용은이 질문을 참조하십시오.


예를 들어 Angular 2-공유 서비스 구현 참조

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

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

IMHO for Angular2 (v2.2.3) the best way is to add services that contain the global variable and inject them into components without the providers tag inside the @Component annotation. By this way you are able to share information between components.

A sample service that owns a global variable:

import { Injectable } from '@angular/core'

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

A sample component that updates the value of your global variable:

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

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

  constructor(private someSharedService: SomeSharedService) { }

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

A sample component that reads the value of your global variable:

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

Note that providers: [ SomeSharedService ] should not be added to your @Component annotation. By not adding this line injection will always give you the same instance of SomeSharedService. If you add the line a freshly created instance is injected.


I don't know the best way, but the easiest way if you want to define a global variable inside of a component is to use window variable to write like this:

window.GlobalVariable = "what ever!"

you don't need to pass it to bootstrap or import it other places, and it is globally accessibly to all JS (not only angular 2 components).


That's the way I use it:

global.ts

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

to use it just import like that:

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: Droped "_" prefixed as recommended.


I think the best way is to share an object with global variables throughout your application by exporting and importing it where you want.

First create a new .ts file for example globals.ts and declare an object. I gave it an Object type but you also could use an any type or {}

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

After that import it

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

And use it

console.log(globalVariables);

I like the answer of @supercobra, but I would use the const keyword as it is in ES6 already available:

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

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

참고URL : https://stackoverflow.com/questions/36158848/how-can-i-declare-a-global-variable-in-angular-2-typescript

반응형