2010-02-03 175 views
0

Gentlepers,從MXML初始化集合

如何在Flex/Actionscript中從MXML初始化集合實例?

背景

讓我們假設:

  • 我已經得到了數名 對三個列表。
  • 每個列表的內容從不改變 ,但我可能想在未來添加新的 列表。
  • 用戶可以選擇使用哪個列表 。

我知道如何 使用MXML來定義/初始化 Flex的UI組件,但是這是我的XML經驗 充分程度。

問題

我怎樣寫XML聲明和ActionScript類,這樣我可以從XML初始化每個我的三個列表的組合?

請注意,我是而不是嘗試用各種數字 - 名稱對填充Flex UI元素(例如DataGrid)。我只是試圖將數據讀入普通的舊香草收藏。 (一旦我初始化了我的集合,我可以填充DataGrid或任何閒暇時間。)我找不到任何有關如何解決這個超簡單情況的文檔。文檔都假設我正在嘗試做更復雜的事情,比如訪問遠程數據庫,這會極大地混淆問題。

謝謝! :-)

吉姆普拉蒙登,德州

回答

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種方法,其中包括wh你可以傳給你的數據提供者。

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

讓我知道是否可行。

+0

我想這是我正在尋找。如果在data3初始化程序中,我使用 2010-02-06 19:54:31

+0

我不明白。 在第一個示例(外部XML文件)或第二個示例(內嵌XML)中實例化哪種類型/類的對象?例如,這兩個例子都沒有涉及「事件」是什麼的定義。 「事件」從哪裏來?您的示例是否假定它已被定義在某處?還是它是Object類的,日期,標題和位置是鍵值對的關鍵字? 爲什麼要實例化無類型數據? 隨着道歉是密集的,對你的企圖賜教(和那些誰潛伏在我後面),我 恭敬地十分讚賞, 吉姆普拉蒙登 德州 – 2010-02-07 03:35:10

+0

遺憾的是,XML對象都是動態的,但如果您手動處理xml,則可以將其轉換爲鍵入的類。假設如果您自己不手動處理xml,並將其傳遞給dataProvider,flex會將其轉換爲動態對象(ObjectProxy,如果resultFormat是默認的,而不是e4x)。 ObjectProxy和Object都基本上只是鍵值對的散列。這是否回答你的問題? – 2010-02-16 05:51:31