从MXML初始化集合

时间:2010-02-03 22:26:48

标签: xml flex actionscript

Gentlepersons,

如何在Flex / Actionscript中从MXML初始化集合实例?

背景

我们假设:

  • 我有三个数字名单 对
  • 每个列表的内容永远不会 变化,但我可能想添加新的 将来列出。
  • 用户可以选择要列出的列表 使用。

我知道怎么做    使用MXML定义/初始化a    Flex UI组件,但就是这样    完整的XML体验。

问题

如何编写XML声明和Actionscript类的组合,以便我可以从XML初始化我的三个列表中的每一个?

请注意,我尝试使用各种数字对填充Flex UI元素(例如DataGrid)。我只是想把数据读成普通的老香草系列。 (一旦我的集合被初始化,我可以在我的闲暇时填充DataGrids或其他任何东西。)我找不到任何关于如何解决这个超级简单案例的文档。文档都假定我正在尝试做一些更复杂的事情,例如访问远程数据库,这会极大地混淆问题。

谢谢! : - )

Jim Plamondon,Texas

1 个答案:

答案 0 :(得分:2)

有几种方法可以做到这一点:

样本数据集:

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

以下是将数据导入XML或ArrayCollection的3种方法,您可以将这两种方法传递给数据提供者。

<?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/>代码。

如果您希望数据是动态的,我只需在视图的<mx:Script/>块中为您的ArrayCollection或XMLListCollection创建一个属性,比如说[Bindable] public var myData:ArrayCollection;,然后通过XML将数据加载到该属性中。通过保持数据外部(不是硬编码/嵌入数据到MXML),您不必重新编译,并且更容易添加越来越多。

为此,您需要使用URLRequest或HTTPService。 HTTPService基本上是围绕URLRequest的MXML包装器。

像这样的伪代码:

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

如果有效,请告诉我。