2016-10-15 40 views
6

我想要做的事:如何使用ResolveComponentFactory(),但有一个字符串作为一个关键

  • 使用类似“resolveComponentFactory()”的东西,但有一个“字符串”标识来获得组件工厂。
  • 一旦获得,开始利用“createComponent(Factory)”方法。

Plnkr示例 - >enter link description here

在示例中,你将看到 “的AddItem” 方法

addItem(componentName:string):void{ 
    let compFactory: ComponentFactory; 
    switch(componentName){ 
     case "image": 
      compFactory = this.compFactoryResolver.resolveComponentFactory(PictureBoxWidget); 
      break; 
     case "text": 
      compFactory = this.compFactoryResolver.resolveComponentFactory(TextBoxWidget); 
      break; 
} 

//How can I resolve a component based on string 
//so I don't need to hard cost list of possible options 


this.container.createComponent(compFactory); 

}

的 “compFactoryResolver:ComponentFactoryResolver” 在构造器注入。

正如您将会注意到的,必须对switch语句中的每个置换进行硬编码并不理想。

当将ComponentFactoryResolver记录到控制台时,我发现它包含一个具有各种工厂的Map。

CodegenComponentFactoryResolver {_parent: AppModuleInjector, _factories: Map} 

但是,这张地图是一个私人的,不能轻易访问(从我可以告诉)。

是否有更好的解决方案,然后以某种方式滚动我自己的类来访问此工厂列表?

我见过很多关于试图创建动态组件的人的消息。但是,这些通常是关于在运行时创建组件的。这里讨论的组件已经预先定义好了,我试图访问使用字符串作为关键字的工厂。

任何意见或建议,非常感谢。

谢谢。

+1

如果在内部没有用字符串标识,你怎么能期望这个类被一个字符串标识? “PictureBoxWidget”类的名称在缩小的应用程序中类似于“a”,并且“TextBoxWidget”类的名称也可能是“a”。您可以维护您自己的组件地图,但需要明确列举它们。有一个可以验证和测试的替代品的固定清单总是更坚实的方法。 – estus

回答

6

它要么定义地图可用组件,

const compMap = { 
    text: PictureBoxWidget, 
    image: TextBoxWidget 
}; 

或定义标识符作为静态类属性将被用来生成地图,

const compMap = [PictureBoxWidget, TextBoxWidget] 
.map(widget => [widget.id, widget]) 
.reduce((widgets, [id, widget]) => Object.assign(widgets, { [id]: widget }), {}); 

的地图,然后使用像

let compFactory: ComponentFactory; 

if (componentName in compMap) { 
    compFactory = this.compFactoryResolver.resolveComponentFactory(compMap[componentName]); 
} else { 
    throw new Error(`Unknown ${componentName} component`); 
} 

有没有办法如何组件类可以神奇地识别为字符串s,因为它们在Angular 2 DI中没有解析为字符串(从Angular 1开始发生了变化,其中所有DI单元都注释为字符串)。

+0

谢谢你的回应。我将着眼于将其融入我目前正在研究的解决方案中。 – Edward

+0

@DeveloperWonk不,有需要。请参阅https:// stackoverflow。com/a/39522406/3731501 – estus

相关问题