2016-10-15 42 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

相關問題