2017-05-31 9 views
1

Iは、注射トークンはこの構成及びプロバイダを注入できるようにするデータのためのインターフェイス、スクロールバーのデフォルトの構成を有し、この設定ファイルを持っていますデフォルトの設定オブジェクトのdeepCloneを返すファクトリが含まれていたモジュール:角度2 DIは、私は、各注射のために独自のインスタンスを必要とする工場とclonnedオブジェクトの同じインスタンスを注入

providers: [ 
     SCROLLBAR_CONFIG_PROVIDER 
    ] 

そして、それは私が私のコンポーネントのコンストラクタでそれを注入方法は次のとおりです:

export interface ScrollbarConfig { 
    name: string; 
    class: string; 
    options: MCustomScrollbar.CustomScrollbarOptions; 
} 

export const SCROLLBAR_CONFIG = new InjectionToken<ScrollbarConfig>('scrollbar.config');` 

export const SCROLLBAR_CONFIG_DEFAULT: ScrollbarConfig = { ... } 

export const SCROLLBAR_CONFIG_PROVIDER = { 
    provide: SCROLLBAR_CONFIG, 
    useFactory:() => { 
      return _.cloneDeep(SCROLLBAR_CONFIG_DEFAULT); 
     } 
}; 

これは私のモジュールにプロバイダを追加する方法です

constructor(@Inject(SCROLLBAR_CONFIG) private scrollbarConfig: ScrollbarConfig) {} 

したがって、スクロールバーのデフォルト設定を取得し、各コンポーネントに注入オブジェクトを拡張することで、各コンポーネントに独自の設定が適用されます。しかし、何らかの理由で、私が工場でプロバイダを使用していても、注射は私に同じインスタンスを与えます。私はそれがデフォルトオブジェクトのdeepCloneを作成すると確信していますが、その後、すべての注入に対してこの同じクローンオブジェクトを返します。私はまた、注入トークンの代わりにクラスを作成することでそれをしようとしましたが、それはまったく同じように動作しました。

私はファクトリ関数ではconsole.log()を入れてみました、それは一度だけので、明らかにこれが問題である印刷されたが、私は実際に異なるインスタンスを提供するために、それをどのように強制することができますか?

+0

もちろん、同じインスタンスを返します。プロバイダはシングルトン(同じインジェクタ内)です。ここで問題となるのは、このプロバイダがどのように使用されているかということです。疑問はそれを明確にする必要があります。 – estus

+0

しかし、私はちょうどあなたがどこでどのように正確に指定していないSCROLLBAR_​​CONFIGが使用されている –

+0

各モジュール内のプロバイダの配列にこのプロバイダを渡すというのが私の質問に指定されました。これは良い答えを与えるために必要です。 – estus

答えて

1

プロバイダは単一のインジェクタ内のシングルトンであり、サービスがモジュールprovidersで定義されている場合、サービスはルートインジェクタ(またはレイジーロードされたモジュール用の子インジェクタ)に属します。

独自のインスタンスを受け取るために、すべてのコンポーネントのために

providersは、これらのコンポーネントのクラスに対して指定する必要があります(とは、モジュールクラス用):サービスを再利用してもすることになってされることはありませんので

@Component({ ..., providers: SCROLLBAR_CONFIG_PROVIDER }) ... 

代わりにuseValueプロバイダーとして定義されたクラスにすることができます。

export class ScrollbarConfig { 
    name: string = ...; 
    class: string = ...; 
    // or 
    // constructor() { 
    // return _.cloneDeep(SCROLLBAR_CONFIG_DEFAULT) 
    // } 
} 

@Module({ ..., providers: { provide: ScrollbarConfig, useValue: ScrollbarConfig }) ... 

@Component(...) 
class SomeComponent { 
    scrollbarConfig: ScrollbarConfig; 

    constructor(@Inject(ScrollbarConfig) ScrollbarConfig: typeof ScrollbarConfig) { 
    this.scrollbarConfig = new ScrollbarConfig(); 
    } 
} 
関連する問題