2010-06-08 73 views
2

是不是有一些方法來重寫下面的代碼,這樣我就不需要每種可想象的類型都有一個巨大的switch語句了?此外,如果我可以用某種方式替換switch語句來動態創建新控件,那麼我可以使代碼更小,更直接,並且不必預測自定義控件類型的可能性。在ActionScript中動態創建Flex組件

前:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical"> 
    <mx:Script> 
    <![CDATA[ 
     import mx.containers.HBox; 
     import mx.controls.Button; 
     import mx.controls.Label; 
     public function CreateControl(event:Event):void { 
     var Type:String=Edit.text; 
     var NewControl:Object; 

     switch (Type) { 
      case 'mx.controls::Label':NewControl=new Label();break; 
      case 'mx.controls::Button':NewControl=new Button();break; 
      case 'mx.containers::HBox':NewControl=new HBox();break; 
      ... every other type, including unforeseeable custom types 
     } 

     this.addChild(NewControl as DisplayObject); 
     } 
    ]]> 
    </mx:Script> 
    <mx:Label text="Control Type"/> 
    <mx:TextInput id="Edit"/> 
    <mx:Button label="Create" click="CreateControl(event);"/> 
</mx:WindowedApplication> 

AFTER:

<?xml version="1.0" encoding="utf-8"?> 
<mx:WindowedApplication xmlns:mx="http://www.adobe.com/2006/mxml" 
    layout="vertical"> 
    <mx:Script> 
    <![CDATA[ 
     import mx.containers.HBox; 
     import mx.controls.Button; 
     import mx.controls.Label; 
     public function CreateControl(event:Event):void { 
     var Type:String=Edit.text; 

     var NewControl:Object= *???*(Type); 

     this.addChild(NewControl as DisplayObject); 
     } 
    ]]> 
    </mx:Script> 
    <mx:Label text="Control Type"/> 
    <mx:TextInput id="Edit"/> 
    <mx:Button label="Create" click="CreateControl(event);"/> 
</mx:WindowedApplication> 
+0

線做一些事情看來這是http://stackoverflow.com/questions/3001499/dynamically-的衍生物在投稿中遇到的問題我會在找到你的投稿解決方案時檢查。但是如果你想要更好的代碼可讀性,你很可能必須把switch語句放在別的類中。乾杯:D – phwd 2010-06-09 00:04:56

+1

你也應該看看http://stackoverflow.com/questions/2016201/dynamic-object-initiation-as3 @ krichard的方法可以工作 – phwd 2010-06-09 00:12:45

回答

4

看看flash.utils.getDefinitionByName()。

我還沒有運行此代碼,但你應該能夠沿着

public function CreateControl(event:Event):void { 
    var Type:String=Edit.text; 
    var controlClass:Class = getDefinitionByName(Type) as Class; 

    var NewControl:Object= new controlClass(); 

    this.addChild(NewControl as DisplayObject); 
} 
+0

重要提示:確保您要使用的控件是參考在您的代碼中的某處,或者它們不會包含在您編譯的最終產品中。如果發生這種情況,當您嘗試使用getDefinitionByName構造某些東西時,您會遇到運行時錯誤。 – Ender 2010-06-09 02:18:37