Как прочитать динамическую форму дочерних данных во Flex? - PullRequest
0 голосов
/ 20 июля 2010

я создал форму динамически, добавив каждый компонент в сценарий действия, Теперь я хочу получить обратно текст / данные, введенные в каждый компонент динамически?

private function loadAllComponents():void
        {   
            var formItemArray:Array = new Array();   

            for(var i:int=0; i< Application.application.designList.length; i++)//which had the colonName, colComponet to be dispalyed,
            {
                var fm:FormItem = new FormItem();

                fm.label = Application.application.designList.getItemAt(i).colName;

                var comp:String = Application.application.designList.getItemAt(i).component;

                switch(comp)
                {
                    case "TextBox":
                        var ti:TextInput = new TextInput();
                        ti.id = Application.application.designList.getItemAt(i).component;
                        fm.addChild(ti);
                    break;

                    case "TextArea":
                        var ta:TextArea = new TextArea();
                        ta.id = Application.application.designList.getItemAt(i).colName;
                        fm.addChild(ta);                        
                    break;

                    case "ComboBox":

                        var mycb:myComboBox = new myComboBox();                                                     
                        mycb.getAllMasterCBData(Application.application.selectedgridItem, Application.application.designList.getItemAt(i).colName);                                                     
                        fm.addChild(mycb);

                    break;

                    case "DateField":
                        var df:DateField = new DateField();
                        df.id = Application.application.designList.getItemAt(i).component;
                        fm.addChild(df);
                    break;
                }
                myform.addChild(fm);                
            }

        }

    private function saveToDb():void // Here i wan to read all the formdata
    {               
        var formItems:Array = myform.getChildren();

        for each (var item:UIComponent in formItems)
        {   
            if (item is TextInput)
            {         
                var text:String = Object(item).text;    

                Alert.show("came here");      
            }
            else if (item is DateField)
            {
                var date:Date = DateField(item).selectedDate;                                   
            }
        }
    }

    ]]>
</mx:Script>

<mx:Form id="myform" cornerRadius="5" borderColor="#B7BABC" borderStyle="solid" width="100%" height="100%" />

<mx:HBox width="100%" height="100%" >
    <mx:Spacer width="120"/>
    <mx:Button label=" Save " id="saveBtn"  click="saveToDb()" />       
</mx:HBox>  

Ответы [ 2 ]

0 голосов
/ 20 июля 2010

Отредактированный ответ:

ОК, думаю, я вижу проблему.

Вы добавляете свои элементы управления данными в FormItems и добавляете их в форму.Но затем вы перебираете дочерние элементы формы, как если бы они были элементами управления данными, а не FormItems.

Не комментируя оставшуюся часть кода, посмотрите, что делает эта обновленная функция для извлеченияэлементы управления данными:

      private function saveToDb():void
      {
           var formItems:Array = myform.getChildren();

           for each (var item:FormItem in formItems)
           {
                var itemChildren:Array = item.getChildren();
                for each (var control:UIComponent in itemChildren)
                {
                     if (control is TextInput)
                     {
                          var text:String = Object(item).text;
                          Alert.show("TextInput");
                     }
                     else if (control is DateField)
                     {
                          var date:Date = DateField(item).selectedDate;
                          Alert.show("Date");
                     }
                }
           }

Вы также можете удалить переменную formItemArray, она не нужна, поскольку мы получаем список дочерних элементов из Form и FormItems.


Исходный ответ:

Если вы сохраняете ссылку на каждый из элементов динамической формы в массиве, вы можете перебирать каждый из них в вашей функции getMyFormData().

например

protected var formItems:Array = new Array();

// Other class stuff here...

var ti:TextInput = new TextInput();       
ti.id = Application.application.designList.getItemAt(i).component;
formItems.push(ti); // Add item to array.
fm.addChild(ti);

var ta:TextArea = new TextArea();        
ta.id = Application.application.designList.getItemAt(i).colName;
formItems.push(ta); // Add item to array.
fm.addChild(ta);    

var df:DateField = new DateField();
df.id = Application.application.designList.getItemAt(i).component;
formItems.push(df); // Add item to array.
fm.addChild(df);

myform.addChild(fm); 


<mx:button click="getMyformData()"/>

private function getMyformData()
{
    //How to get the myform Data dynamically here after validations... ? & 
    for each (var item:UIComponent in formItems)
    {
        if (item is TextInput || item is TextArea)
        {
            // Cast to Object to access the 'text' property without the compiler complaining.
            var text:String = Object(item).text;
            // Do something with the text...
        }
        else if (item is DateField)
        {
            var date:Date = DateField(item).selectedDate;
            // Do something with the date...
        }
        // Insert additional type checks as needed.
    }
}

Вам придется самостоятельно решить, что делать с данными:)

Если вы используете отдельный список, убедитесь, что вы очищаете массив formItems, когдавы закончили с этим, поэтому у вас нет ссылок на элементы, которые хранят их в памяти без необходимости.

Вместо того, чтобы хранить отдельный массив элементов формы, вы также можете перебирать дочерние элементы в fm контейнер.Возможно, вам придется сделать некоторые предположения относительно детей, к которым вы будете обращаться, но похоже, что вы контролируете всех добавляемых детей, так что это не проблема.

Надеюсь, это поможет ...

:)

0 голосов
/ 20 июля 2010

Вы создаете компоненты ввода в ActionScript, но на основе этого кода вы не создаете их динамически;Вы просто жестко их кодируете.С вашим примером вы узнаете компоненты, которые вы создаете во время компиляции.

Вам нужно будет сохранить ссылку на элементы формы, которые вы создаете;сделайте их открытыми переменными вместо локальных переменных 'var'.Примерно так:

protected var ti:TextInput ;       
protected var ta:TextArea ;        
protected var df:DateField;

Затем в вашем методе создания сделайте что-то вроде этого:

ti = new TextInput();       
ti.id = Application.application.designList.getItemAt(i).component;
fm.addChild(ti);

ta  = new TextArea();        
ta.id = Application.application.designList.getItemAt(i).colName;
fm.addChild(ta);    

df = new DateField();
df.id = Application.application.designList.getItemAt(i).component;
fm.addChild(df);

myform.addChild(fm); 

Затем, когда вам нужно получить к ним доступ, просто сделайте что-то вроде этого:

private function getMyformData()
{
       ti.text;
       ta.text;
}

Если вы генерируете компоненты формы во время выполнения на основе данных, то сохраняйте, а затем сохраняйте элементы формы в некотором массиве.

Вы могли бы также что-то решить, зацикливаясь на всех дочерних элементах вашего контейнера, хотя это был бы не мой первый подход.


Поскольку на постере размещен более полный код;Вот некоторые дополнения.Я добавил защищенный массив всех элементов формы и в каждом блоке 'switch';новый элемент ввода помещается в массив.

<mx:Script>
protected var itemsArray : Array = new Array();
private function loadAllComponents():void
    {   
        var formItemArray:Array = new Array();   

        for(var i:int=0; i< Application.application.designList.length; i++)//which had the colonName, colComponet to be dispalyed,
        {
            var fm:FormItem = new FormItem();

            fm.label = Application.application.designList.getItemAt(i).colName;

            var comp:String = Application.application.designList.getItemAt(i).component;

            switch(comp)
            {
                case "TextBox":
                    var ti:TextInput = new TextInput();
                    ti.id = Application.application.designList.getItemAt(i).component;
                    fm.addChild(ti);
                    itemsArray.push(ti)
                break;

                case "TextArea":
                    var ta:TextArea = new TextArea();
                    ta.id = Application.application.designList.getItemAt(i).colName;
                    fm.addChild(ta);                        
                    itemsArray.push(ta)
                break;

                case "ComboBox":

                    var mycb:myComboBox = new myComboBox();                                                     
                    mycb.getAllMasterCBData(Application.application.selectedgridItem, Application.application.designList.getItemAt(i).colName);                                                     
                    fm.addChild(mycb);
                    itemsArray.push(mycb)

                break;

                case "DateField":
                    var df:DateField = new DateField();
                    df.id = Application.application.designList.getItemAt(i).component;
                    fm.addChild(df);
                    itemsArray.push(df)
                break;
            }
            myform.addChild(fm);                
        }

    }

Метод sateToDb изменится примерно так:

private function saveToDb():void // Here i wan to read all the formdata
{               
    var formItems:Array = myform.getChildren();

    for each (var item:UIComponent in itemsArray )
    {   
        if (item is TextInput)
        {         
            var text:String = Object(item).text;    

            Alert.show("came here");      
        }
        else if (item is DateField)
        {
            var date:Date = DateField(item).selectedDate;                                   
        }
    }
}

    ]]>
</mx:Script>
...