私はいくつかの変数がどこでもアクセスできるようにしたいと思いAngular 2
におけるTypescript
言語。これを達成するにはどうすればよいですか?
Uncaught ReferenceError: Settings is not defined
ます。Settings
public static変数を持つクラスは、エクスポートするように設定されており、使用した場所にインポートされています。
私はいくつかの変数がどこでもアクセスできるようにしたいと思いAngular 2
におけるTypescript
言語。これを達成するにはどうすればよいですか?
Uncaught ReferenceError: Settings is not defined
ます。Settings
public static変数を持つクラスは、エクスポートするように設定されており、使用した場所にインポートされています。
回答:
以下は、最も単純なソリューションであり、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 (**Updated**)
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
import * as globs from 'globals'
export const
代わりに使用しexport var
ます-あなたは本当にそれらのグローバル変数が変更されないことを確実にしたいのです
import * as myGlobals from 'globals'
import * as myGlobals from './path/to/globals';
@supercobraのソリューションも気に入っています。少し改善したいだけです。すべての定数を含むオブジェクトをエクスポートする場合、es6 を使用して、requireを使用せずにモジュールをインポートできます。
また、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;
}
ただし、アプリケーション全体で1つのインスタンスを共有できるように登録する場合は、十分に注意する必要があります。アプリケーションを登録するときに定義する必要があります。
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);
}
}
詳細については、この質問を参照してください:
HTTP_PROVIDERS
も同様ですが、それらも追加されるべきではありませんbootstrap()
か?
bootstrap()
が、実際にはそれは問題ではありません。それらをリストすることでboostrap()
コードが理解しやすくなると思います。コンポーネントには、プロバイダー、ディレクティブ、テンプレートがあります。ここにもグローバルプロバイダーがリストされていないため、これは過負荷になっています。したがって、私は好むbootstrap()
。
alert(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);
}
}
bootstrap()
。bootstrap()
とルートコンポーネントは2つの異なるものです。あなたが呼び出すとbootstrap(AppComponent, [MyService])
、あなたはでサービスを登録boostrap()
し、AppComponent
ルートコンポーネントです。ドキュメントは、ルートコンポーネントにプロバイダー(サービス)を登録することが望ましいとどこかで述べていますproviders: ['MyService']
が、私は賛成か反対bootstrap()
か、またはルートコンポーネントの議論をまだ見つけていません。
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 {
}
Globals
を追加して追加するproviders: [ ... ]
と、1つのコンポーネント内の値を変更してから、2番目のコンポーネント内の更新された値を要求できないことに注意してください。注入Globals
するたびに、それは新しいインスタンスです。この動作を変更する場合は 、プロバイダーとして追加しないでくださいGlobals
。
@Injectable()
IMHO for Angular2(v2.2.3)の最良の方法は、グローバル変数を含むサービスを追加し、それらをアノテーション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
。行を追加すると、新しく作成されたインスタンスが挿入されます。
Unhandled Promise rejection: No provider for SomeSharedService
providers: [SomeSharedService]
親モジュールファイルに追加する必要があります。ありがとう。
最善の方法はわかりませんが、コンポーネント内でグローバル変数を定義する最も簡単な方法は、window
変数を使用して次のように記述することです。
window.GlobalVariable = "what ever!"
ブートストラップに渡したり、他の場所にインポートしたりする必要はなく、すべてのJSにグローバルにアクセスできます(角度2コンポーネントだけでなく)。
それが私がそれを使う方法です:
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
}
編集:推奨されるように接頭辞「_」を削除。
最善の方法は、オブジェクトを必要な場所にエクスポートおよびインポートすることにより、アプリケーション全体でグローバル変数とオブジェクトを共有することです。
まず、globals.tsなどの新しい.tsファイルを作成し、オブジェクトを宣言します。私はそれを与えたオブジェクトの種類をあなたも使うことができ、あらゆるタイプまたは{}
export let globalVariables: Object = {
version: '1.3.3.7',
author: '0x1ad2',
everything: 42
};
その後、それをインポートします
import {globalVariables} from "path/to/your/globals.ts"
そしてそれを使う
console.log(globalVariables);