从自定义组件调度自定义事件 [英] Dispatching custom event from a custom component

查看:186
本文介绍了从自定义组件调度自定义事件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个自定义的Flex 4.5组件(在列表中使用) -

I have a custom Flex 4.5 component (to be used in a List) -

Game.mxml (表示一个可打卡的游戏桌) p>

Game.mxml (represents a clickable playing table in a card game):

<?xml version="1.0" encoding="utf-8"?>
<s:ItemRenderer 
    xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    xmlns:mx="library://ns.adobe.com/flex/mx" 
    xmlns:comps="*"
    width="160" height="160" 
    autoDrawBackground="false"
    creationComplete="init(event)">

    <fx:Metadata> 
        [Event(name="pref_event", type="PrefEvent")] 
    </fx:Metadata>

    <fx:Script>
        <![CDATA[
            import mx.events.FlexEvent;

            private var _data:XML;

            [Bindable("dataChange")]
            public override function get data():Object {
                return _data;
            }

            public override function set data(value:Object):void {
                _data = value as XML;
                if (null == _data)
                    return;

                gameid = _data.@id;

                for (var i:uint = 0; i < 3; i++) {
                    this['_user' + i].data = _data.elements('user')[i];
                }

                dispatchEvent(new FlexEvent(FlexEvent.DATA_CHANGE));
            }

            public function init(event:FlexEvent):void {
                _rect.filters = Util.SHADOW;
                addEventListener(MouseEvent.CLICK, handleClick);
            }

            private function handleClick(event:MouseEvent):void {
            trace("Clicked: " + gameid);
                dispatchEvent(new PrefEvent(PrefEvent.GAME_CLICKED, gameid, true));
            }

            public function set gameid(str:String):void {
                _gameid.text = '#' + str;
            }

            public function get gameid():String {
                return _gameid.text.substring(1);
            }
        ]]>
    </fx:Script>

    <s:Rect id="_rect" x="20" y="20" width="120" height="120" radiusX="16" radiusY="16">
        <s:stroke>
            <s:SolidColorStroke color="#4F69B5" weight="4"/>
        </s:stroke>     
        <s:fill>
            <s:SolidColor color="#CCDDEE" />
        </s:fill>
    </s:Rect>

    <s:Label id="_gameid" x="0" y="75" width="{width}" fontSize="16" textAlign="center" color="#FFFFFF" />

    <comps:User id="_user0" x="56"  y="4" scaleX=".3" scaleY=".3" interactive="false" visible="false" />
    <comps:User id="_user1" x="108" y="60" scaleX=".3" scaleY=".3" interactive="false" visible="false" />
    <comps:User id="_user2" x="4"   y="60" scaleX=".3" scaleY=".3" interactive="false" visible="false" />

</s:ItemRenderer>

我正在尝试从中发送一个自定义事件 - PrefEvent.as

and I'm trying to dispatch a custom event from it - PrefEvent.as:

package {
    import flash.events.Event;

    public class PrefEvent extends Event {
        public var str:String;
        public static const GAME_CLICKED:String = 'game_clicked';
        public static const CARD_CLICKED:String = 'card_clicked';
        public static const CARD_PLAYED:String  = 'card_played';

        public function PrefEvent(type:String, n:String, bubbles:Boolean = false, cancelable:Boolean = false){
            super(type, bubbles,cancelable);
            str = n;
        }

        public override function clone():Event {
            return new PrefEvent(type, str, bubbles, cancelable);
        }

        public override function toString():String {
            return str;
        }
    }
}

最后我的测试代码 - GameTest.mxml

And here is finally my test code - GameTest.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"
    xmlns:comps="*"
    width="700" height="525" 
    creationComplete="init()">

    <fx:Script>
        <![CDATA[
            public function init():void {
                game.data = <game id="8946">
                                <user id="OK353118989212"/>
                                <user id="OK351923295875"/>
                            </game>;
            }       

            private function gameClicked(event:PrefEvent):void {
                trace("game clicked: " + event);
            }           
        ]]>
    </fx:Script>

    <comps:Game id="game" x="0" y="0" pref_event="gameClicked(event)" />

</s:Application>

但我从来没有看到游戏点击:跟踪。有没有人知道为什么?

But I never see the "game clicked: " trace. Does anybody please know why?

我可能错过了一些小事,因为我可以看到Clicked:8946的踪迹。

I'm probably missing something minor, because I can see the "Clicked: 8946" trace.

推荐答案

问题:



Game.mxml 事件

[Event(name="pref_event", type="PrefEvent")]

,但您的派发 PrefEvent.GAME_CLICKED(game_clicked)

您必须为此分配正确的事件。

You must dispatch the right event for this.

dispatchEvent( new PrefEvent("pref_event",gameid, true) );  

这篇关于从自定义组件调度自定义事件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆