2

私は Angular 2 のライブラリ サービスを作成しています。呼び出し元のアプリケーションが何らかの構成を提供できるようにしたいと考えています。基本クラスで抽象プロパティを作成することもできましたが、これにより、呼び出し元のアプリケーションが複数の場所で構成を定義しなければならなくなります。

Angular2 アプリケーション内では、メイン アプリケーション モジュールでこのような手法を使用します

let config: any = { param1: 'value 1', param2: 'value 2' };

@NgModule({
    providers: [ {provide: 'app.config', useValue: config } ]
})

その後、 @Inject('app.config') を使用して、必要な場所に構成を挿入できます。ただし、私が書いているライブラリは拡張する基本クラスを定義しているため、呼び出し元のアプリケーションが値を注入して super() 経由で転送する必要があるため、この値をコンストラクターに注入したくありません。

ReflectiveInjector クラスを見てきましたが、文字列ではなく型が必要です。

    let appConfig = ReflectiveInjector.resolve('app.config').get();

どうすればこれを達成できますか?

4

2 に答える 2

0

OpaqueToken を定義できます

export const APP_CONFIG = new OpaqueToken('app.config');

文字列を使用する代わりに、型として使用します

let appConfig = ReflectiveInjector.resolve(APP_CONFIG).get();

私の理解が正しければ、アプリケーションが初期化される前に単一の要求でいくつかの構成データをロードし、それをシングルトンに保持する必要があります。投稿#37611549をご覧になることを強くお勧めします。アプリの初期化時に関数を実行し、関数が promise を返す場合に提供するものを遅らせるための APP_INITIALIZER の使用について説明しています。

于 2016-11-11T12:25:23.183 に答える
0

ReflectiveInjector クラスを見てきましたが、文字列ではなく型が必要です。

このようなもの?

let config: any = { param1: 'value 1', param2: 'value 2' };

let injector: any = ReflectiveInjector.resolveAndCreate([
  {
    provide: 'app.config',
    useValue: config
  }
]);

let configService = injector.get('app.config');

console.log(configService);
于 2016-11-11T12:22:25.560 に答える