使用HTTPService填充ArrayCollection

时间:2009-11-11 19:01:16

标签: flex flex3 httpservice arraycollection

是的,有一个像这样的问题,但没有活动也没有答案。

我想使用HTTPService从外部XML文件加载数据,并且在同一HTTPService的ResultEvent上,我希望他使用XML中的数据填充ArrayCollection。

我认为ArrayCollection是这个XML的理想选择。但我愿意接受建议。

XML

<?xml version="1.0" encoding="utf-8"?>
<PhotoGalleryData>
    <Photo>
        <id>1</id>
        <name>Summer Vacation</name>
        <description>In vacation</description>
        <source>vacation.JPG</source>
    </Photo>
    <Photo>
        <id>2</id>
        <name>Winter Vacation</name>
        <description>coold</description>
        <source>vacation2.JPG</source>
    </Photo>
</PhotoGalleryData>

我认为getDataResultHandler()中的这一简单行足以填充ArrayCollection。

<mx:HTTPService id="getData"
        url="{XMLDataFileLocation}"
        fault="getDataFaultHandler()"
        result="getDataResultHandler()"/>

[Bindable]
private var PhotoData:ArrayCollection;

private function getDataResultHandler():void
{
    PhotoData = new ArrayCollection(getData.lastResult.PhotoGalleryData.photo)
}

但我想这不是,因为只是为了确保我已经将一个List绑定到ArrayCollection以实际查看它是否真的已填充。

<mx:List dataProvider="{PhotoData}" labelField="name"/>

并且列表没有显示任何数据,因此不能正常工作。

感谢您的帮助。

修改

  

注意

     

使用的<mx:List/>就是这样   确定ArrayCollection是   确实人口稠密,它不会被用于   App。


采取Bozho建议的结果。

使用Bozho更改Flex不再报告var类型错误,但是一旦我运行它。 Adobe Flash会报告此事。

  

TypeError:错误#1034:输入强制   失败:无法转换   mx.utils :: ObjectProxy @ 22cd311 to   mx.collections.ArrayCollection。在   图片集锦/ getDataResultHandler()[C:\用户\法比奥   Antunes \ Documents \ Flex Builder 3 \ Photo   画廊的\ src \动作脚本\ PhotoGallery.as:56]     在   图片集锦/ __ getData_result()[C:\用户\法比奥   Antunes \ Documents \ Flex Builder 3 \ Photo   Gallery \ src \ PhotoGallery.mxml:23] at   flash.events::EventDispatcher/dispatchEventFunction()     在   flash.events::EventDispatcher/dispatchEvent()     在   mx.rpc.http.mxml ::的HTTPService / http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[C:\自动构建\ 3.2.0 \框架\项目\ RPC \ SRC \ MX \ RPC \ HTTP \ MXML \ HTTPService.as:290]     在   mx.rpc :: AbstractInvoker / http://www.adobe.com/2006/flex/mx/internal::resultHandler()[C:\自动构建\ 3.2.0 \框架\项目\ RPC \ SRC \ MX \ RPC \ AbstractInvoker.as:193]     在   mx.rpc ::响应/结果()[C:\自动构建\ 3.2.0 \框架\项目\ RPC \ SRC \ MX \ RPC \ Responder.as:43]     在   mx.rpc :: AsyncRequest /应答()[C:\自动构建\ 3.2.0 \框架\项目\ RPC \ SRC \ MX \ RPC \ AsyncRequest.as:74]     在   DirectHTTPMessageResponder /在completeHandler()[C:\自动构建\ 3.2.0 \框架\项目\ RPC \ SRC \ MX \消息\通道\ DirectHTTPChannel.as:403]     在   flash.events::EventDispatcher/dispatchEventFunction()

然后Flash第23行报告错误:

PhotoData = ArrayCollection(event.result);

第23行是:

result="getDataResultHandler(event)"

2 个答案:

答案 0 :(得分:3)

如果您可以使用XMLListCollection代替ArrayCollection,则转换结果对象的过程会更加简单。 Here是一个很好的教程,解释了如何解决这个问题。

编辑:

本教程的主要内容是:

  • 您需要将服务的结果格式设置为e4x
  • 您需要将结果对象强制转换为XML对象,将重复节点提取为XMLList,并从列表中构造XMLListCollection,如下所示:

    private function httpService_result(evt:ResultEvent):void 
    {
         var xmlList:XMLList = XML(evt.result).path.to.repeating.element;
         xmlListColl = new XMLListCollection(xmlList);
    }
    

答案 1 :(得分:0)

您可以像这样简化脚本:

<mx:HTTPService id="getData" url="{XMLDataFileLocation}"/>
<mx:List dataProvider="{getData.lastResult.Photo}" labelField="name"/>

lastResult的{​​{1}}将成为XML的根。通过检索getData,您将获得lastResult.Photo张照片。