2010-10-15 40 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

相关问题