Инициализация коллекции из MXML - PullRequest
0 голосов
/ 04 февраля 2010

Gentlepersons,

Как инициализировать экземпляр коллекции из MXML во Flex / Actionscript?

Фон

Предположим, что:

  • У меня есть три списка числовых имен пар.
  • Содержимое каждого списка никогда изменения, но я могу добавить новые списки в будущем.
  • Пользователь может выбрать, какой список использовать.

я знаю как использовать MXML для определения / инициализации Компонент Flex UI, но это в полной мере мой опыт XML.

Задача

Как мне написать комбинацию объявлений XML и классов ActionScript, чтобы я мог инициализировать каждый из моих трех списков из XML?

Обратите внимание, что я не пытаюсь заполнить элемент Flex UI (например, DataGrid) различными парами чисел-имен. Я просто пытаюсь прочитать данные в простую старую коллекцию ванили. (После того, как мои коллекции инициализированы, я могу заполнить DataGrids или что-нибудь еще на досуге.) Я не могу найти документацию о том, как решить этот супер-простой случай. Во всей документации предполагается, что я пытаюсь сделать что-то намного более сложное, например, получить доступ к удаленной базе данных, что очень запутывает проблему.

Спасибо! : -)

Джим Пламондон, Техас

1 Ответ

2 голосов
/ 04 февраля 2010

Есть несколько способов сделать это:

Пример набора данных:

<?xml version="1.0" encoding="UTF-8"?>
<events type="array">
    <event>
        <date>12-50-99</date>
        <title>Event A</title>
        <location>San Diego, CA</location>
    </event>
    <event>
        <date>12-50-99</date>
        <title>Event B</title>
        <location>Healdsburg, CA</location>
    </event>
</events>

Flex 4

XML декларации

Ниже приведены 3 способа передачи данных в XML или ArrayCollection, которые вы можете передать своему поставщику данных.

<?xml version="1.0" encoding="utf-8"?>
<s:Application 
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Declarations>
        <fx:XML id="data" source="events.xml"/>

        <fx:XML id="data2">
            <event>
                <date>12-50-99</date>
                <title>Event A</title>
                <location>San Diego, CA</location>
            </event>
            <event>
                <date>12-50-99</date>
                <title>Event B</title>
                <location>Healdsburg, CA</location>
            </event>
        </fx:XML>

        <fx:Declarations>
            <mx:ArrayCollection id="data3">
                <fx:Object date="12-50-99" title="Event A" location="San Diego, CA"/>
                <fx:Object date="12-50-99" title="Event B" location="Healdsburg, CA"/>
            </mx:ArrayCollection>
        </fx:Declarations>
    </fx:Declarations>

    <!-- then your views -->
    <mx:Button/>
</s:Application>

Flex 3 работает так же, но вы просто удаляете теги <fx:Declarations/>.

Если вы хотите, чтобы данные были динамическими, я просто создал бы свойство для вашего ArrayCollection или XMLListCollection в блоке <mx:Script/> в вашем представлении, скажем [Bindable] public var myData:ArrayCollection;, и загрузил бы данные в него через XML. Сохраняя ваши данные внешними (без жесткого кодирования / встраивания данных в MXML), вам не нужно перекомпилировать, и проще добавлять все больше и больше.

Чтобы сделать это, вам нужно будет использовать URLRequest или HTTPService. HTTPService - это, по сути, оболочка MXML для URLRequest.

Примерно так: псевдокод:

<?xml version="1.0" encoding="utf-8"?>
<s:Application 
    xmlns:fx="http://ns.adobe.com/mxml/2009"
    xmlns:s="library://ns.adobe.com/flex/spark"
    xmlns:mx="library://ns.adobe.com/flex/mx"
    initialize="loadData()">
    <fx:Script>

        import mx.collections.*;

        [Bindable] public var list1:IList;
        [Bindable] public var list2:IList;
        [Bindable] public var list3:IList;

        public function loadData():void
        {
            eventsService.load(); // loads, may take a few frames/seconds
        }

        public function updateData(result:Object, property:String):void
        {
            // this["list1"] = xml;
            this[property] = new XMLListCollection(result);
        }

    </fx:Script>

    <fx:Declarations>
        <mx:HTTPService id="eventsService"
            url="events.xml" 
            resultFormat="e4x"
            result="updateData(event.result, 'list1');"
            fault="trace('eventsService Error');"/>
    </fx:Declarations>

    <!-- then your views -->
    <mx:List dataProvider="{list1}"/>
</s:Application>

Дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...