我想要做的事:如何使用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}
但是,这张地图是一个私人的,不能轻易访问(从我可以告诉)。
是否有更好的解决方案,然后以某种方式滚动我自己的类来访问此工厂列表?
我见过很多关于试图创建动态组件的人的消息。但是,这些通常是关于在运行时创建组件的。这里讨论的组件已经预先定义好了,我试图访问使用字符串作为关键字的工厂。
任何意见或建议,非常感谢。
谢谢。
如果在内部没有用字符串标识,你怎么能期望这个类被一个字符串标识? “PictureBoxWidget”类的名称在缩小的应用程序中类似于“a”,并且“TextBoxWidget”类的名称也可能是“a”。您可以维护您自己的组件地图,但需要明确列举它们。有一个可以验证和测试的替代品的固定清单总是更坚实的方法。 – estus