Flex 4。将数据从主应用程序传递到自定义组件

时间:2010-10-15 18:03:23

标签: flex actionscript-3 data-binding

我在其他地方找不到我想要的东西,或者至少没有足够的成就来适应

我正在尝试创建一个项目,显示带有徽标,收听按钮等的广播电台

数据源是一个xml文件,其子标记如'name','image'和'listen',用于每个父级'station'。  我通过主应用程序使用creationComplete =“radioService.send()”访问此数据 然后我可以通过dataProvider =“{radioService.lastResult.stations.station}

在主应用上使用它

但是,我想使用结果在组件本身的自定义组件中填充变量

硬编码示例

mx:Image source =“Images / BBC5.gif”id =“bbc5Logo”“/>

mx:LinkBut​​ton id =“bbc5Listen”click =“bbc5Listen_clickHandler(event)”/>

和点击处理程序

protected function bbc5Listen_clickHandler(event:MouseEvent):void    {

var url:String =“http://www.bbc.co.uk/iplayer/console/bbc_radio_five_live”;     var request:URLRequest = new URLRequest(url);

} 任何帮助,非常感谢

5 个答案:

答案 0 :(得分:0)

之前我做过类似的事情,虽然我不确定你希望你的应用程序有什么外观和感觉,但是可以创建一个Datagrid并将数据源绑定到该网格。 然后,您可以向数据源添加字段(img字段并通过将xpath设置为该字段来使用XML中的链接),也可以创建一个按钮并将其放在datagrid的行中以进行监听。 / p>

显然,这是一个稍微不同的实现,但如果您创建了一个自定义组件,那么同样的原则也适用,然后确保它使用DataSource和DataSource字段,这些字段将从XML的正确部分获取数据。然后,可以将该DataSource字段映射到String,例如。

希望这有帮助

答案 1 :(得分:0)

另一种方法可能是从XML创建Value Objects并将组件绑定到这些对象,这样就可以将组件与XML分离,如果在将来的某个时候,您可能不方便例如,使用XML,但使用JSON。

每个Value Object都有你问题中定义的属性,即imageSource,id,url等......每个组件都绑定到一个Value Object

编辑 看看这个视频培训,它涵盖了从XML的数据检索,ValueObjets的ArrayCollections等... http://www.adobe.com/devnet/flex/videotraining.html

答案 2 :(得分:0)

您实际上可以使用自定义事件,您可以将值从主应用程序传递到自定义组件。

http://www.anujgakhar.com/2009/03/04/flex-passing-data-with-custom-events/

答案 3 :(得分:0)

有两种方法可以实现这一目标:

  • 你应该包装你的数据结构 从xml源到[Bindable] actionscript 对象(不是强制性的,但你可以 处理它更容易),并绑定这些数据实例的数组(比如说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>
  • 另一种方法是建立自定义 处理额外事件的事件 parameter:通道的url。 这些自定义事件应该级联回列表组件,在那里应该处理它们。

因为对于第二个解决方案,你仍然需要第一个绑定,我会选择第一个,并在本地处理click事件。

希望这会有所帮助。

答案 4 :(得分:0)

我认为这可能很有用,要将值从mainApp传递到自定义组件,您可以遵循此方法。由于您拥有mainApp中的值,因此您可以使用parentDocument对象在自定义组件中访问该值。{{1 }}