Как отправить коллекцию ArrayCollection в новое / подокно? - PullRequest
0 голосов
/ 01 июля 2011

Вчера phtrivier показал мне , как отправить массив в новое / подокно .

Теперь я заменил этот статический источник данных на файл XML, который загружается в коллекцию ArrayCollection. К сожалению, я обнаружил, что ArrayCollection ведет себя не так, как Array, когда вы пытаетесь отправить его часть в новое / подокно.

Как я могу сделать это с ArrayCollection?

Или я должен пойти простым путем с отправкой массива и вместо этого искать способ сделать загрузку XML в массив вместо ArrayCollection? Я не думаю, что потребует дополнительных функций, предлагаемых AC.

MyMain.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:WindowedApplication ...stuff... creationComplete="settingService.send()">
    <fx:Declarations>
        <s:HTTPService id="settingService" url="data.xml" result="settingService_resultHandler(event)"/>
    </fx:Declarations>
    <fx:Script>
        <![CDATA[
            // import dependencies
            import mx.collections.ArrayCollection;
            import mx.rpc.events.ResultEvent;

            // variables
            [Bindable] private var xmlData:ArrayCollection;

            // collect static data
            private var staticData1:Array = new Array('The Eiffel Tower','Paris','John Doe');
            private var staticData2:Array = new Array('The Strip','Las Vegas','Jane Doe');
            private var staticData:Array = new Array(staticData1, staticData2);

            // collect xml data
            protected function settingService_resultHandler(event:ResultEvent):void
            {
                xmlData = event.result.settings.photo;
            }

            // open window & send data in Array, WORKING
            public function openWin1(inData:Array):void
            {
                var w:MyWindow1 = new MyWindow1();
                w.inData = inData;
                w.open();
            }

            // open window & send data in ArrayCollection, NOT WORKING
            public function openWin2(inData:ArrayCollection):void
            {
                var w:MyWindow2 = new MyWindow2();
                w.inData = inData;
                w.open();
            }
        ]]>
    </fx:Script>
    <!--opening windows, adding an array, WORKING-->
    <s:Button x="10" y="10" width="240" label="open a sub-window 1" click="openWin1(staticData[0]);"/>
    <s:Button x="10" y="30" width="240" label="open a sub-window 2" click="openWin1(staticData[1]);"/>
    <!--opening windows, adding an arraycollection, NOT WORKING-->
    <s:Button x="10" y="60" width="240" label="open a sub-window 1" click="openWin2(xmlData.getItemAt(5));"/>
    <s:Button x="10" y="80" width="240" label="open a sub-window 2" click="openWin2(xmlData[5].source);"/>
    <s:Button x="10" y="100" width="240" label="open a sub-window 3" click="openWin2(xmlData.getItemAt(5).source);"/>
</s:WindowedApplication>

MyWindow1.mxml (должно быть хорошо, все-таки работает)

<?xml version="1.0" encoding="utf-8"?>
<mx:Window ...stuff...>
    <mx:Script>
        <![CDATA[
            // variables
            [Bindable] private var windowData:Array;

            // receive data
            public function set inData(outData:Array):void {
                this.windowData = outData;
            }
        ]]>
    </mx:Script>
    <mx:TextInput id="comment" x="10" y="10" text="{windowData[0]}"/>
    <mx:TextInput id="location" x="10" y="30" text="{windowData[1]}"/>
    <mx:TextInput id="author" x="10" y="50" text="{windowData[2]}"/>
</mx:Window>

MyWindow2.mxml

<?xml version="1.0" encoding="utf-8"?>
<mx:Window ...stuff...>
    <mx:Script>
        <![CDATA[
            // import dependencies
            import mx.collections.ArrayCollection;

            // variables
            [Bindable] private var windowData:ArrayCollection;

            // receive data
            public function set inData(outData:ArrayCollection):void {
                this.windowData = outData;
            }
        ]]>
    </mx:Script>
    <mx:TextInput id="comment" x="10" y="10" text="{windowData.comment}"/>
    <mx:TextInput id="location" x="10" y="30" text="{windowData.location}"/>
    <mx:TextInput id="author" x="10" y="50" text="{windowData.author}"/>
</mx:Window>

1 Ответ

0 голосов
/ 18 июля 2011

Нашел собственное решение: загруженный XML-файл поступает как ArrayCollection, но мне все равно нужно было запустить его через повторитель.При запуске через повторитель массивы внутри становятся Объектом.У меня такой же опыт работы с объектами, как и с ArrayCollections, но методом проб и ошибок я нашел следующий рабочий код.Yay!

// MyMain.mxml // inside the repeater
click="openWin(event.currentTarget.getRepeaterItem())"

// MyMain.mxml // opening the window and sending the data
private function openWin(transferData:Object):void
{
    var w:MyWindow = new MyWindow();
    w.transferData = transferData;
    w.open();
}

// MyWindow.mxml // variables
[Bindable] private var windowData:Object;

// MyWindow.mxml // receive the data
public function set transferData(transferData:Object):void
{
    this.windowData = transferData;
}

// MyWindow.mxml // use the data
<mx:Label text="{windowData.author}"/>

Хотя это не отправляет ArrayCollection, это решило мою проблему и может сделать отправку фактической ArrayCollection очень простой.

...