Динамическое создание компонентов Flex в ActionScript - PullRequest
2 голосов
/ 09 июня 2010

Нет ли способа переписать следующий код, чтобы мне не требовался гигантский оператор switch для каждого мыслимого типа?Кроме того, если я могу заменить оператор switch каким-либо способом для динамического создания новых элементов управления, то я могу сделать код меньше, более прямым и не должен предвидеть возможность создания пользовательских типов элементов управления.:

<?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>

ПОСЛЕ:

<?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>

1 Ответ

4 голосов
/ 09 июня 2010

Посмотрите на 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);
}
...