[typescript] 전역 상수 정의

Angular 1.x에서는 다음과 같이 상수를 정의 할 수 있습니다.

angular.module('mainApp.config', [])
    .constant('API_ENDPOINT', 'http://127.0.0.1:6666/api/')

Angular (TypeScript 사용)와 동등한 기능은 무엇입니까?

모든 서비스에서 API 기본 URL을 반복해서 반복하고 싶지 않습니다.



답변

Angular 2 최종 버전에서 다음 변경 사항이 적용되었습니다.

export class AppSettings {
   public static API_ENDPOINT='http://127.0.0.1:6666/api/';
}

그리고 서비스에서 :

import {Http} from 'angular2/http';
import {Message} from '../models/message';
import {Injectable} from 'angular2/core';
import {Observable} from 'rxjs/Observable';
import {AppSettings} from '../appSettings';
import 'rxjs/add/operator/map';

@Injectable()
export class MessageService {

    constructor(private http: Http) { }

    getMessages(): Observable<Message[]> {
        return this.http.get(AppSettings.API_ENDPOINT+'/messages')
            .map(response => response.json())
            .map((messages: Object[]) => {
                return messages.map(message => this.parseData(message));
            });
    }

    private parseData(data): Message {
        return new Message(data);
    }
}


답변

각도 팀 자체에서 제공하는 구성에 대한 솔루션은 여기 에서 찾을 수 있습니다 .

모든 관련 코드는 다음과 같습니다.

1) app.config.ts

import { OpaqueToken } from "@angular/core";

export let APP_CONFIG = new OpaqueToken("app.config");

export interface IAppConfig {
    apiEndpoint: string;
}

export const AppConfig: IAppConfig = {
    apiEndpoint: "http://localhost:15422/api/"
};

2) app.module.ts

import { APP_CONFIG, AppConfig } from './app.config';

@NgModule({
    providers: [
        { provide: APP_CONFIG, useValue: AppConfig }
    ]
})

3) your.service.ts

import { APP_CONFIG, IAppConfig } from './app.config';

@Injectable()
export class YourService {

    constructor(@Inject(APP_CONFIG) private config: IAppConfig) {
             // You can use config.apiEndpoint now
    }
}

이제 문자열 이름을 사용하지 않고 정적 검사를 위해 인터페이스를 사용하지 않고도 어디서나 구성을 주입 할 수 있습니다.

물론 인터페이스와 상수를 분리하여 생산 및 개발에 다른 값을 제공 할 수 있습니다.


답변

Angular2에는 다음과 같은 정의가 제공 되어 다양한 종류의 종속성을 설정할 수 있습니다.

provide(token: any, {useClass, useValue, useExisting, useFactory, deps, multi}

각도 1과 비교

app.serviceAngular1의 경우 Angular2의 경우와 같습니다 useClass.

app.factoryAngular1의 경우 Angular2의 경우와 같습니다 useFactory.

app.constantapp.value단순화 된 useValue적은 제약. 즉, config더 이상 차단이 없습니다.

app.provider -Angular 2에는 해당 사항이 없습니다.

루트 인젝터로 설정하려면 :

bootstrap(AppComponent,[provide(API_ENDPOINT, { useValue='http://127.0.0.1:6666/api/' })]);

또는 구성 요소 인젝터로 설정하십시오.

providers: [provide(API_ENDPOINT, { useValue: 'http://127.0.0.1:6666/api/'})]

provide 짧은 손입니다 :

var injectorValue = Injector.resolveAndCreate([
  new Provider(API_ENDPOINT, { useValue: 'http://127.0.0.1:6666/api/'})
]);

인젝터를 사용하면 가치를 얻는 것이 쉽습니다.

var endpoint = injectorValue.get(API_ENDPOINT);


답변

Angular 4에서는 환경 클래스를 사용하여 모든 전역을 유지할 수 있습니다.

기본적으로 environment.ts 및 environment.prod.ts가 있습니다.

예를 들어

export const environment = {
  production: false,
  apiUrl: 'http://localhost:8000/api/'
};

그리고 당신의 서비스에 :

import { environment } from '../../environments/environment';
...
environment.apiUrl;


답변

Angular 4+ 용으로 업데이트

이제 angular-cli를 통해 프로젝트가 생성되면 angular가 기본값을 제공하는 환경 파일을 간단히 사용할 수 있습니다.

예를 들어

환경 폴더에서 다음 파일을 작성하십시오.

  • environment.prod.ts
  • environment.qa.ts
  • environment.dev.ts

각 파일은 다음과 같은 관련 코드 변경 사항을 보유 할 수 있습니다.

  • environment.prod.ts

    export const environment = {
         production: true,
         apiHost: 'https://api.somedomain.com/prod/v1/',
         CONSUMER_KEY: 'someReallyStupidTextWhichWeHumansCantRead',
         codes: [ 'AB', 'AC', 'XYZ' ],
    };
  • environment.qa.ts

    export const environment = {
         production: false,
         apiHost: 'https://api.somedomain.com/qa/v1/',
         CONSUMER_KEY : 'someReallyStupidTextWhichWeHumansCantRead',
         codes: [ 'AB', 'AC', 'XYZ' ],
    };
  • environment.dev.ts

    export const environment = {
         production: false,
         apiHost: 'https://api.somedomain.com/dev/v1/',
         CONSUMER_KEY : 'someReallyStupidTextWhichWeHumansCantRead',
         codes: [ 'AB', 'AC', 'XYZ' ],
    };

적용 사례

서비스와 같은 파일로 환경을 가져올 수 있습니다 clientUtilServices.ts

import {environment} from '../../environments/environment';

getHostURL(): string {
    return environment.apiHost;
  }

빌드의 유스 케이스

각도 cli 파일을 열고 .angular-cli.json내부 "apps": [{...}]에 다음 코드를 추가하십시오.

 "apps":[{
        "environments": {
            "dev": "environments/environment.ts",
            "prod": "environments/environment.prod.ts",
            "qa": "environments/environment.qa.ts",
           }
         }
       ]

프로덕션 용으로 빌드 하려면 또는에서 수행 할 수있는 것과 동일한 방식으로 ng build --env=prod구성을 실행 하십시오. environment.prod.tsqadev

## 이전 답변

제공자에서 다음과 같은 일을하고 있습니다.

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

@Injectable()
export class ConstantService {

API_ENDPOINT :String;
CONSUMER_KEY : String;

constructor() {
    this.API_ENDPOINT = 'https://api.somedomain.com/v1/';
    this.CONSUMER_KEY = 'someReallyStupidTextWhichWeHumansCantRead'
  }
}

그런 다음 어디서나 모든 상수 데이터에 액세스 할 수 있습니다

import {Injectable} from '@angular/core';
import {Http} from '@angular/http';
import 'rxjs/add/operator/map';

import {ConstantService} from  './constant-service'; //This is my Constant Service


@Injectable()
export class ImagesService {
    constructor(public http: Http, public ConstantService: ConstantService) {
    console.log('Hello ImagesService Provider');

    }

callSomeService() {

    console.log("API_ENDPOINT: ",this.ConstantService.API_ENDPOINT);
    console.log("CONSUMER_KEY: ",this.ConstantService.CONSUMER_KEY);
    var url = this.ConstantService.API_ENDPOINT;
    return this.http.get(url)
  }
 }


답변

문자열 상수가 ApiEndpoint 인 AppSettings 클래스를 사용하는 방법은 작동하지만 단위 테스트시이 실제 ApiEndpoint를 다른 값으로 바꿀 수 없기 때문에 적합하지 않습니다.

이 API 끝점을 서비스에 주입 할 수 있어야합니다 (서비스를 다른 서비스에 주입하는 것을 고려하십시오). 우리는 이것을 위해 전체 클래스를 만들 필요가 없습니다. 우리가 원하는 것은 ApiEndpoint 인 서비스에 문자열을 주입하는 것입니다. pixelbits탁월한 답변 을 완성하기 위해 Angular 2에서 어떻게 수행 할 수 있는지에 대한 완전한 코드가 있습니다.

먼저 앱에서 요청할 때 ApiEndpoint의 인스턴스 를 제공 하는 방법을 Angular에 알려 주어야합니다 (종속성을 등록하는 것으로 생각하십시오).

bootstrap(AppComponent, [
        HTTP_PROVIDERS,
        provide('ApiEndpoint', {useValue: 'http://127.0.0.1:6666/api/'})
]);         

그런 다음 서비스 에서이 ApiEndpoint를 서비스 생성자에 주입 하고 Angular는 위의 등록을 기반으로 우리에게 제공합니다.

import {Http} from 'angular2/http';
import {Message} from '../models/message';
import {Injectable, Inject} from 'angular2/core';  // * We import Inject here
import {Observable} from 'rxjs/Observable';
import {AppSettings} from '../appSettings';
import 'rxjs/add/operator/map';

@Injectable()
export class MessageService {

    constructor(private http: Http,
                @Inject('ApiEndpoint') private apiEndpoint: string) { }

    getMessages(): Observable<Message[]> {
        return this.http.get(`${this.apiEndpoint}/messages`)
            .map(response => response.json())
            .map((messages: Object[]) => {
                return messages.map(message => this.parseData(message));
            });
    }
    // the rest of the code...
}


답변

이것은이 시나리오에 대한 최근의 경험입니다.

  • @ 각도 / cli : 1.0.0
  • 노드 : 6.10.2
  • @ 각도 / 코어 : 4.0.0

나는 공식 및 업데이트 된 문서를 따라왔다.

https://angular.io/docs/ts/latest/guide/dependency-injection.html#!#dependency-injection-tokens

보인다 OpaqueToken는 이제 사용되지 않으며 우리가 사용해야합니다 InjectionToken을 , 그래서 이러한 매력처럼 실행 내 파일입니다 :

app-config.interface.ts

export interface IAppConfig {

  STORE_KEY: string;

}

app-config.constants.ts

import { InjectionToken } from "@angular/core";
import { IAppConfig } from "./app-config.interface";

export const APP_DI_CONFIG: IAppConfig = {

  STORE_KEY: 'l@_list@'

};

export let APP_CONFIG = new InjectionToken< IAppConfig >( 'app.config' );

app.module.ts

import { APP_CONFIG, APP_DI_CONFIG } from "./app-config/app-config.constants";

@NgModule( {
  declarations: [ ... ],
  imports: [ ... ],
  providers: [
    ...,
    {
      provide: APP_CONFIG,
      useValue: APP_DI_CONFIG
    }
  ],
  bootstrap: [ ... ]
} )
export class AppModule {}

my-service.service.ts

  constructor( ...,
               @Inject( APP_CONFIG ) private config: IAppConfig) {

    console.log("This is the App's Key: ", this.config.STORE_KEY);
    //> This is the App's Key:  l@_list@

  }

결과는 깨끗 하고이 문제에 대한 John Papa의 최근 의견에 대한 콘솔 감사의 경고는 없습니다.

https://github.com/angular/angular-cli/issues/2034

키는 인터페이스가 아닌 다른 파일로 구현되었습니다.