2017-05-31 30 views
1

我有這個配置文件,它具有數據接口,滾動條的默認配置,注入令牌能夠注入此配置和提供程序包含工廠返回默認配置對象deepClone模塊:當我需要自己的實例爲每個注入時,Angular 2 DI注入克隆對象的相同實例

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

這是怎麼加提供商到我的模塊:

providers: [ 
     SCROLLBAR_CONFIG_PROVIDER 
    ] 

這就是我如何在我的部件構造注入它:

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

所以這個想法是獲得滾動條的默認配置,然後擴展每個組件的注入對象,所以每個組件都有自己的配置。但由於某些原因,即使我在工廠使用提供程序,注入也會給我相同的實例。我非常肯定它會產生一個默認對象的深層克隆,但隨後爲每次注入返回相同的克隆對象。我也試圖用創建類而不是注入令牌來做到這一點,但它的表現完全一樣。

我試圖把console.log()放在工廠函數中,它只打印一次所以顯然這是問題,但我怎麼能強迫它真正提供不同的實例?

+0

當然,它返回相同的實例。提供者是單身人士(在相同的注射器內)。這裏重要的是如何使用這個提供者,這個問題需要澄清。 – estus

+0

但我在我的問題中指定我只是將此提供程序傳遞給每個模塊中的提供程序數組 –

+0

您尚未指定SCROLLBAR_​​CONFIG的使用方式和位置。這是必要的,以給出一個很好的答案。 – 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(); 
    } 
} 
相關問題