Flex 4从自定义组件中调度自定义事件(为什么将自定义事件Flex转换为mouseevent)

时间:2012-03-02 05:22:09

标签: actionscript-3 flex events actionscript flex4

这与我的earlier post不重复(略有不同)

但这是类似错误的类似问题,但错误不一样

从我的自定义组件

调度自定义事件时,我现在得到的错误如下

TypeError:错误#1034:类型强制失败:无法将事件:: MapEvent @ a74ab51转换为flash.events.MouseEvent。

     dispatchEvent(new MapEvent(MapEvent.CLICKED_ON_MAP));

注意:我的earlier post中的错误显示以下错误消息

类型强制失败:无法将flash.events::Event@81ecb79转换为com.events.ShopEvent

这里的区别是两件事,早期的错误是将flash事件转换为自定义事件,现在这个是将自定义事件转换为flash事件,其次,我不知道为什么它试图转换为mouseevent我只是用适当的听众调度我的自定义事件。

有人可以纠正我在这里做错了什么。

这是我的客户活动

package events
{
    import flash.events.Event;

    import ui.map.MapElement;

    public class MapEvent extends Event
    {
        public static const NEW_ELEMENT_ATTACHED:String = "newElementAttached";
        public static const CLICKED_ON_MAP:String = "clickedOnMap";
        public static const CLICKED_ON_ELEMENT:String = "clickedOnElement";

        public var element:MapElement;

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

        override public function clone():Event{

            var c:MapEvent = new MapEvent(type, bubbles, cancelable);
            c.element = this.element;
            return c;
        }
    }
}

这就是我从自定义组件(WorldMap.as类文件)

调度事件的方法
    private function clickHandler(e:MouseEvent):void{
        e.stopImmediatePropagation();
        trace("worldmap click handler");
        if (dragInProgress){
            /*trace ("stopping event propagation");*/
            dragInProgress = false;
            return;
        }else{
            trace("dispatching proxy click event");
            dispatchEvent(new MapEvent(MapEvent.CLICKED_ON_MAP));
        }
    }

我已宣布[Event] metatag

[Event(name="newElementAttached", type="events.MapEvent")]
[Event(name="clickedOnMap", type="events.MapEvent")]
[Event(name="clickedOnElement", type="events.MapEvent")]

最后,侦听器附加在其他组件(controller.as)

        _userWorld.addEventListener(MapEvent.CLICKED_ON_MAP,clickedOnWorldMap);
        _userWorld.addEventListener(MapEvent.CLICKED_ON_ELEMENT,clickedOnElement);

    private function clickedOnWorldMap(e:MouseEvent):void{
        _draggingMapElement.hideBaseGrid();
        _draggingMapElement = null;
    }
    private function clickedOnElement(e:MapEvent):void{

    }

1 个答案:

答案 0 :(得分:0)

这是我的坏事。我修好了这个愚蠢的小虫。

我更改了lister函数定义。 (将mouseevent替换为MapEvent)

    private function clickedOnWorldMap(e:MapEvent):void{
        _draggingMapElement.hideBaseGrid();
        _draggingMapElement = null;
    }