2009-11-11 34 views
0

是的,有這樣一個問題,但沒有活動,也沒有答案。使用HTTPService填充ArrayCollection

我想要從外部XML文件,使用HTTPService和相同的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) 
} 

但我想它是不是,因爲只是要確定我已經把綁定到一個ArrayCollection列表實際上看它是否真的被填充。

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

而且該列表沒有顯示任何數據,所以沒有按預期工作。

感謝您的任何幫助。

編輯

NOTE

The <mx:List/> used is just to be sure that the ArrayCollection is indeed populated, it won't be used in the App.


結果採取Bozho建議。

隨着Bozho的變化Flex不再報告var類型的錯誤,但一旦我運行它。 Adobe Flash確實報告了這一點。

TypeError: Error #1034: Type Coercion failed: cannot convert mx.utils::[email protected] to mx.collections.ArrayCollection. at PhotoGallery/getDataResultHandler()[C:\Users\Fábio Antunes\Documents\Flex Builder 3\Photo Gallery\src\ActionScripts\PhotoGallery.as:56] at PhotoGallery/__getData_result()[C:\Users\Fábio Antunes\Documents\Flex Builder 3\Photo Gallery\src\PhotoGallery.mxml:23] at flash.events::EventDispatcher/dispatchEventFunction() at flash.events::EventDispatcher/dispatchEvent() at mx.rpc.http.mxml::HTTPService/ http://www.adobe.com/2006/flex/mx/internal::dispatchRpcEvent()[C :\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\http\mxml\HTTPService.as:290] at mx.rpc::AbstractInvoker/ http://www.adobe.com/2006/flex/mx/internal::resultHandler()[C :\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\AbstractInvoker.as:193] at mx.rpc::Responder/result()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\Responder.as:43] at mx.rpc::AsyncRequest/acknowledge()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\rpc\AsyncRequest.as:74] at DirectHTTPMessageResponder/completeHandler()[C:\autobuild\3.2.0\frameworks\projects\rpc\src\mx\messaging\channels\DirectHTTPChannel.as:403] at flash.events::EventDispatcher/dispatchEventFunction()

很好,閃存報告錯誤的行23:

PhotoData = ArrayCollection(event.result); 

第23行是:

result="getDataResultHandler(event)" 
+0

爲什麼它必須是一個' ArrayCollection'?在大多數情況下,您可以使用'XMLListCollection'作爲數據提供者來代替'ArrayCollection'。 – 2009-11-11 20:50:37

+0

我會嘗試一下。 – 2009-11-11 20:59:16

+0

Ryan,採取你的建議我該如何填充XMLListCollection與HTTPService數據? – 2009-11-11 21:03:01

回答

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); 
    } 
    
+0

我正在嘗試與ArrayCollection類似的方法。我將嘗試使用XMLListCollection ... – 2009-11-11 21:22:24

+0

它們在大多數情況下是可以互換的,ArrayCollection採用'Array'作爲參數,'XMLListCollection'採用'XMLList'。我想不出你爲什麼要把兩者混合在一起的一般原因。 – 2009-11-11 21:27:21

+0

解決了。謝謝。 – 2009-11-11 21:59:07

0

您可以簡化您的腳本是這樣的:

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

The lastResult o如果你的getData將成爲你的XML的根。通過檢索lastResult.Photo你會得到一張XMLList的照片。

+0

是的,我知道,謝謝,但事情是,我使用列表只是爲了確保它正在工作,該列表將不會在應用程序中使用。 – 2009-11-11 19:16:04