2017-05-31 32 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(); 
    } 
} 
相关问题