Как передать массив значений из одного компонента mxml в другой во Flex?

У меня есть компонент mxml с сеткой данных, в которой перечислены имена проектов и версии кода. У меня есть выбранные проекты из сетки данных, связанные с общедоступной переменной с именем selectedProjects. Но как получить доступ к этой переменной в другом компоненте mxml. Я хочу имя выбранного проекта в текстовой области этого компонента. как это сделать? Я даже создал экземпляр первого компонента и использовал тот, который называется переменной selectedProjects. Но я не получаю обновление значения в текстовой области.

Это код для первого компонента, где я получаю имя выбранного проекта в переменной:

<?xml version="1.0" encoding="utf-8"?>
<mx:TitleWindow xmlns:mx="http://www.adobe.com/2006/mxml" 
            creationComplete="handleCreationComplete();"
            width="800" height="600">
<mx:Script>
    <![CDATA[
        import mx.controls.Alert;
        import mx.managers.PopUpManager;
        import mx.collections.ArrayCollection;
        import mx.events.ItemClickEvent;

        [Bindable] public var selectedProjects:Array;

        private function handleCreationComplete():void {
                           PopUpManager.centerPopUp(this);
        }   

        public var pages:ArrayCollection=new ArrayCollection([
            {label:"10"},
            {label:"20"},]);

        public var projectList:ArrayCollection=new ArrayCollection([

           {ItemName:"User Requirement Specification",ItemCodeVersion:"URS - 1"},
           {ItemName:"User Requirement Specification",ItemCodeVersion:"URS - 2"}, 
           {ItemName:"Software Requirement Specification",ItemCodeVersion:"SRS - 2.1"},
           {ItemName:"Software Design Specification",ItemCodeVersion:"SDS - 2"},
           {ItemName:"Software Design Specification",ItemCodeVersion:"SRS - 1.1"},
           {ItemName:"User Manual",ItemCodeVersion:"User Manual - 1"},
           {ItemName:"User Manual",ItemCodeVersion:"User Manual - 2.1"},]);


         private function close():void
         {
        PopUpManager.removePopUp(this);
        }

        private function select():void
        {
            Alert.show(projectListDG.selectedItem.ItemName);
            PopUpManager.removePopUp(this);
        }   

    ]]>                                      
</mx:Script>

<mx:Binding source="projectListDG.selectedItems" destination="selectedProjects" />
<mx:Label styleName="labelHeading" text="Project Documents List"/>

<mx:Panel width="100%" height="100%" layout="vertical" title="Documents List" >
    <mx:HBox>
        <mx:Label text="Show"/>
        <mx:ComboBox dataProvider="{pages}" width="60" />
        <mx:Label text="results per page" />
    </mx:HBox>

    <mx:DataGrid id="projectListDG" dataProvider="{projectList}" allowMultipleSelection="true" rowCount="10" width="100%" height="100%">
        <mx:columns>

            <mx:DataGridColumn headerText="Select" itemRenderer="mx.controls.CheckBox"  textAlign="center" width="50"/>
            <mx:DataGridColumn headerText="Item Name" dataField="ItemName" textAlign="center" />
            <mx:DataGridColumn headerText="Item Code - Version" dataField="ItemCodeVersion" textAlign="center" width="150 " />

        </mx:columns>
    </mx:DataGrid>

         <mx:Label text="{projectListDG.selectedItem.ItemName}"/>
</mx:Panel>

      <mx:HBox horizontalAlign="center" width="100%"> 
         <mx:Button label="Select" click="select();"/>
         <mx:Button label="Cancel" click="close();"/> 
      </mx:HBox> 
</mx:TitleWindow>

Теперь у меня есть выбранные проекты в переменной selectedProjects.

Теперь это второй компонент, в котором я пытаюсь использовать имя проекта.

<?xml version="1.0" encoding="utf-8"?>
<mx:VBox xmlns:mx="http://www.adobe.com/2006/mxml" width="100%" height="100%">
<mx:Script>
    <![CDATA[
        import mx.collections.ArrayCollection;
        import mx.core.IFlexDisplayObject;
        import mx.managers.PopUpManager;
        import mx.containers.TitleWindow;             

        [Bindable]    
        public var projectList:projDocsLookUp=new projDocsLookUp();

        //Datagrid  
        [Bindable] 
         private var defectDetails:ArrayCollection = new ArrayCollection([
            {Select:true},          
        ]);        

        private function projDocsPopUp():void{
            var helpWindow:TitleWindow = TitleWindow(PopUpManager.createPopUp(this, projDocsLookUp, true));
            helpWindow.title="Project Documents List";
        }
                ]]>
</mx:Script>
<mx:Label styleName="labelHeading" text="Defect Entry - Verification" />

    <mx:Panel width="100%" height="30%" layout="vertical" title="Review Report Details">
        <mx:VBox width="100%">
            <mx:FormItem label="Project Name:" width="100%">
                <mx:Text text="IPMS"/>              
            </mx:FormItem>
            <mx:HRule width="100%"/>            
        <mx:VBox>                           
             <mx:FormItem label="Project Documents:">
             <mx:HBox>
<!--text="{projectList.projectListDG.selectedItem.ItemName}"-->
                                        <mx:TextArea id="projDocs" width="150" text="{projectList.selectedProjects}" />//text area field is not updated.
                                <mx:Button width="30" label=".." click="projDocsPopUp();"/> 
            </mx:HBox>
            </mx:FormItem>

            </mx:VBox>
              </mx:Panel>

<mx:Panel width="100%" height="50%" layout="vertical" title="Defect Details" >

<mx:DataGrid id="defectDG" dataProvider="{defectDetails}"          variableRowHeight="true" width="100%" height="75" >

  <mx:columns>
    <mx:DataGridColumn dataField="Select" itemRenderer="mx.controls.CheckBox" width="50" textAlign="center" />

    <mx:DataGridColumn dataField="Defect Id" itemRenderer="mx.controls.TextInput" textAlign="center"/> 

    <mx:DataGridColumn dataField="Status" itemRenderer="mx.controls.ComboBox"   textAlign="center"/>                                
</mx:columns>
</mx:DataGrid>


</mx:Panel>

   </mx:VBox>

Я пытался обновить значение выбранных проектов в текстовой области Id "projDocs", но я не понимаю .. Пожалуйста, кто-нибудь, помогите мне ..

13.10.2009 08:31:51
Разве ваше TitleWindow не закрывается после выбора элемента (в вашем методе select ())? Не означает ли это, что выбранное имя проекта больше не доступно, поэтому вы не сможете прочитать его в другом классе?
Michael Todd 14.10.2009 04:28:54
Ох .. Я новичок в освоении и просто изучаю это, как я делаю свой проект. Так как передать переменную?
Angeline 14.10.2009 04:51:02
Нет ли способа передать данные даже после закрытия окна?
Angeline 14.10.2009 05:04:34
Я бы передал имя метода в класс projDocsLookup при создании (имя метода будет существующим методом в вашем классе VBox, единственной целью которого является получение заголовка). Затем, когда пользователь закрывает диалоговое окно, используйте функцию обратного вызова для передачи заголовка. К сожалению, я не знаю достаточно о Flex, чтобы показать вам, как это сделать. Посмотрите функции обратного вызова и события, связанные с передачей переменных в вашей любимой поисковой системе. Удачи!
Michael Todd 14.10.2009 05:06:19
Возможно, стоит взглянуть на архитектуру MVC - Cairngorm, PureMVC и др. Я начал без MVC, и как только я его обнаружил, это сэкономило мне МНОГО времени. Я на самом деле вернулся к рефакторингу всего приложения для использования Cairngorm - оно того стоило. Удачи!
Eric Belair 15.10.2009 14:58:52
1 ОТВЕТ
РЕШЕНИЕ

Ну, я нашел решение самостоятельно ..

Погуглил конечно. Я следовал методу, приведенному в этом уроке.

Я добавил ссылку на элемент управления TextArea родительского приложения. Всплывающий компонент использует эту ссылку для обновления TextArea первого компонента.

В первом компоненте я изменил функцию, которая создает всплывающее окно, как

 private function projDocsPopUp():void{

            var helpWindow:projDocsLookUp = projDocsLookUp(PopUpManager.createPopUp(this, projDocsLookUp, true));
            helpWindow.title="Project Documents List";
            helpWindow.showCloseButton=true;
            helpWindow.targetComponent=projDocs; //I get the value returned by the pop up window here

А затем во всплывающем компоненте изменил функцию выбора следующим образом:

 private function select():void
        {
            var i:int;
            for(i=0;i<selectedProjects.length;i++)
              {
               targetComponent.text+=selectedProjects[i].ItemName+",";
            }


            PopUpManager.removePopUp(this);
        }   

И, наконец, я обновляю имя проекта в поле текстовой области первого компонента.

1
14.10.2009 07:41:22