我想要做的事:如何使用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