2010-10-15 72 views
3

我還沒有找到完全是我想在其他地方,或者至少我沒有完成足夠的適應Flex 4。從主應用程序將數據傳遞到自定義組件

我試圖創建一個項目,顯示了標誌的電臺,收聽按鈕等

數據源是一個xml文件,每個父'station'具有'name','image'和'listen'等子標籤。 我經由與creationComplete主應用程序=「radioService.send()」 然後我可以通過數據提供程序=「{} radioService.lastResult.stations.station上使用它的主要應用

但是,我想訪問該數據使用導致兩種成分以填充變量在定製組件本身

硬編碼的例子

MX:圖像源=「圖像/ BBC5.gif」 ID =「bbc5Logo」「/>

mx:LinkBut​​ton id =「bbc5Listen」click =「bbc5Listen_clickHandler(event)」/>

和在clickHandler

保護的函數bbc5Listen_clickHandler(事件:MouseEvent)方法:無效 {

VAR URL:字符串=「http://www.bbc.co.uk/iplayer/console/ bbc_radio_five_live「; var request:URLRequest = new URLRequest(url);

} 任何幫助,非常感謝

回答

0

我以前做過類似的事情,雖然我不知道什麼樣的外觀和感覺,你希望你的應用有,但它有可能創建一個DataGrid和綁定的數據源那個網格。 然後,您可以將字段添加到數據源中(img字段,並通過將xpath設置爲該字段來使用XML中的鏈接),也可以創建一個按鈕並將其放置在數據網格的行中以供偵聽。

顯然這是一個稍微不同的實現,但是如果你創建了一個自定義組件,那麼確保它使用了DataSource和DataSource字段來獲得來自XML右邊部分的數據。然後,可以將該DataSource字段映射到字符串。

希望這有助於

+0

新的做法,可能會更有意義是讓主要應用填充自定義組件和應用價值,以它們的屬性,但我仍然有問題 – pssguy 2010-10-16 22:05:56

+0

新的做法,可能會更有意義就是有主應用程序填充定製組件並將值應用於其屬性,但我仍然遇到問題 – pssguy 2010-10-16 22:06:14

0

另一種方法可以創建一個從你的XML值對象和你的組件綁定到這些對象,這樣你會從XML,它可以很方便解耦組件,如果在某些時候在未來,您不希望使用XML,而是使用JSON。

每個值的對象將在你的問題,即,ImageSource的,ID,網址等定義的屬性...和每個組件將被綁定到一個值對象

編輯 看一看這個視頻培訓,它涵蓋了數據檢索從XML,ValueObjets等ArrayCollections ...
http://www.adobe.com/devnet/flex/videotraining.html

+0

謝謝你。我會跟進你的建議 – pssguy 2010-10-16 21:11:36

+0

我實際上正在嘗試另一種方法 - 再次出現問題 – pssguy 2010-10-16 22:04:10

0

有兩種方法來實現:

  • ,則應該從XML源包裝你的數據結構 到[Bindable]動作 對象(不是強制性的,但你可以 處理更容易),並將這些數據實例的數組(作爲RadioChannel.class)綁定爲網格的dataProvider。裏面你itemRenderer實現,你可以通過data的getter/setter訪問當前行的RadioChannel例如:

RadioChannel.as:

[Bindable] 
public class RadioChannel { 

    private var _name: String; 
    private var _imageUrl: String; 
    private var _listenUrl: String; 

    public function RadioChannel() 
    { 
    } 

    public function get name():String {return _name;} 
    public function set name(value:String):void {_name = value;} 

    public function get imageUrl():String {return _imageUrl;} 
    public function set imageUrl(value:String):void {_imageUrl = value;} 

    public function get listenUrl():String {return _listenUrl;} 
    public function set listenUrl(value:String):void {_listenUrl = value;} 

    public function toString():String 
    { 
     return 'RadioChannel ' + name + ' - image: ' + imageUrl + 
      ' | listen at ' + listenUrl; 

    } 
} 

RadioList.mxml:

<?xml version="1.0" encoding="utf-8"?> 
<mx:DataGrid xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:mx="library://ns.adobe.com/flex/mx" dataProvider="{radioChannels}"> 
    <fx:Script> 
     <![CDATA[ 
      import mx.collections.ArrayCollection; 

      private var _radioChannels:ArrayCollection = new ArrayCollection(); 
      [Bindable] 
      private function get radioChannels():ArrayCollection {return _radioChannels;} 
      private function set radioChannels(value:ArrayCollection):void {_radioChannels = value;} 

     ]]> 
    </fx:Script> 
    <mx:columns> 
     <mx:DataGridColumn> 
      <mx:itemRenderer> 
       <fx:Component> 
        <mx:Image source="{data.imageUrl}"> 
         <fx:Script> 
          <![CDATA[ 

           public override function set data(value:Object):void 
           { 
            super.data = value; 
            trace('current instance: ' + RadioChannel(data).toString()); 
           } 

          ]]> 
         </fx:Script> 
        </mx:Image> 
       </fx:Component> 
      </mx:itemRenderer> 
     </mx:DataGridColumn> 
     <mx:DataGridColumn dataField="name" /> 
     <mx:DataGridColumn> 
      <mx:itemRenderer> 
       <fx:Component> 
        <mx:HBox> 
         <fx:Script> 
          <![CDATA[ 
           protected function onLinkClicked(event:MouseEvent):void 
           { 
            var currentChannel:RadioChannel = RadioChannel(data); 
            if (data) 
            { 
             var request:URLRequest = new URLRequest(currentChannel.listenUrl); 
             [...] 
            } 
           } 

          ]]> 
         </fx:Script> 
         <mx:Button click="onLinkClicked(event)" label="Listen" /> 
        </mx:HBox> 
       </fx:Component> 
      </mx:itemRenderer> 
     </mx:DataGridColumn> 
    </mx:columns> 
</mx:DataGrid> 
  • 另一種方法是構建自定義的 事件,該事件處理額外的 參數:通道的網址。 這些自定義事件應該級聯回列表組件,它們應該在哪裏處理。

由於第二個解決方案,你仍然需要第一的綁定以及,我會選擇第一個,並在本地處理click事件。

希望這有助於。

+0

謝謝你。我好幾個月沒有看過這個,所以對於遲到的回覆感到抱歉。我會在某個時候測試它 – pssguy 2011-05-26 15:01:23

0

我認爲這可能是有用的,將值從mainApp傳遞到自定義組件,您可以按照此方法。因爲您有mainApp中的值,所以在自定義組件中您可以通過使用parentDocument對象來訪問該值。 parentDocument.rootAppVar

相關問題