开发者

Inherited a class from EventDispatcher in Flash but custom event not received

I have a custom event that is dispatched when a slider is moved but I receive no event from inherited dispatcher class I created whereas I followed the same syntax as solution for My flash custom event doesn't trigger

Event class:

package {

    import flash.events.Event;

     public class CustomEvent extends Event
     {
            public static const ON_DISPATCHER_EVENT = "onDispatcherEvent";
        public var value:Number;

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

     }

}

Dispatcher:

package {

    import flash.events.EventDispatcher;
    import flash.events.Event;

    public class CustomEventDispatcher extends EventDispatcher {

        private var cEvent: CustomEvent;      

        public function CustomEventDispatcher() {

        }

        public function raiseEvent(_value:Number) {
            cEvent = new CustomEvent(CustomEvent.ON_DISPATCHER_EVENT);
            cEvent.value = _value;
            dispatchEvent(cEvent);                      
        }

    }
}

Test class:

package {

    import flash.display.*;
    import flash.net.*;
    import flash.events.*;
    import fl.events.SliderEvent;
    import fl.controls.Slider;

    public class TestCustomEvent extends MovieClip {        

      private var c开发者_运维知识库Event: CustomEvent;

      public function TestCustomEvent() {   

        addEventListener( Event.ADDED_TO_STAGE, init);  

      }

      public function init( e:Event ):void {

        removeEventListener( Event.ADDED_TO_STAGE, init );

        this.addEventListener(CustomEvent.ON_DISPATCHER_EVENT,OnDispatcherEvent);

        slider.addEventListener(SliderEvent.CHANGE,OnSliderEventChange);

      } 


      public function OnDispatcherEvent(event:CustomEvent): void {

            trace(event.value);
      }


      public function OnSliderEventChange(event:SliderEvent) {

            cEvent = new CustomEvent(CustomEvent.ON_DISPATCHER_EVENT);
            cEvent.value = event.value;
            dispatchEvent(cEvent);
                    trace("hello");

      }

    }       
}


I think your understanding of the event flow is a bit off. The answer I already gave in My flash custom event doesn't trigger (that I'm assuming you didn't read) I think is the proper way to use custom Event and IEventDispatcher objects:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        private var _sliderSprite:SliderSprite;

        public function Main():void 
        {
            if (stage) init();
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void 
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            _sliderSprite = new SliderSprite();
            _sliderSprite.x = (stage.stageWidth / 2);
            _sliderSprite.y = (stage.stageHeight / 2);
            addChild(_sliderSprite);

        }// end function
    }// end class

}// end package

import fl.controls.Slider;
import fl.events.SliderEvent;
import flash.display.Sprite;

internal class SliderSprite extends Sprite
{
    private var _slider:Slider;

    public function SliderSprite()
    {
        init();

    }// end function

    private function init():void
    {
        _slider = new Slider();
        addChild(_slider);

        _slider.addEventListener(SliderEvent.CHANGE, onSliderChange);
        addEventListener(CustomEvent.CUSTOM_EVENT_TYPE, onSliderSpriteCustomEventType);

    }// end function

    private function onSliderSpriteCustomEventType(e:CustomEvent):void
    {
        trace(e.value);

    }// end function

    private function onSliderChange(e:SliderEvent):void
    {
        dispatchEvent(new CustomEvent(CustomEvent.CUSTOM_EVENT_TYPE, e.value));

    }// end function

}// end class

import flash.events.Event;

internal class CustomEvent extends Event
{
    public static const CUSTOM_EVENT_TYPE:String = "customEventType";
    private var _value:Number;

    public function get value():Number
    {
        return _value;

    }// end function

    public function CustomEvent(type:String, 
                                value:Number,
                                bubbles:Boolean = false,
                                cancelable:Boolean = false)
    {
        _value = value;

        super(type, bubbles, cancelable);

    }// end function

    override public function clone():Event
    {
        return new CustomEvent(type, value, bubbles, cancelable);

    }// end function

}// end class

[UPDATE] [EDITED 08/04/2011 08:22]

I've modified the code to encapsulate all code involving dispatching and listening to/for events, as well as excuting event handlers, into another class(EventDispatcherManager).

import flash.display.Sprite;
import flash.events.IEventDispatcher;

internal class SliderSprite extends Sprite
{
    private var _slider:Slider;
    private var _eventDispatcherManager:EventDispatcherManager;

    public function SliderSprite()
    {
        init();

    }// end function

    private function init():void
    {
        _slider = new Slider();
        addChild(_slider);

        _eventDispatcherManager = new EventDispatcherManager(IEventDispatcher(_slider));

    }// end function

}// end class

import fl.controls.Slider;
import fl.events.SliderEvent;
import flash.events.EventDispatcher;

internal class EventDispatcherManager extends EventDispatcher
{
    public function EventDispatcherManager(slider:IEventDispatcher)
    {
        slider.addEventListener(SliderEvent.CHANGE, onSliderChange);
        this.addEventListener(CustomEvent.CUSTOM_EVENT_TYPE, onCustomEventType);

    }// end function

    private function onSliderChange(e:SliderEvent):void
    {
        this.dispatchEvent(new CustomEvent(CustomEvent.CUSTOM_EVENT_TYPE, e.value));

    }// end function

    private function onCustomEventType(e:CustomEvent):void
    {
        trace(e.value);

    }// end function

}// end function


Is hello being traced?

It looks like maybe there is a vague reference as to which dispatcher is calling the disptachEvent() method. Try specifying slider.dispatchEvent() and use slider.addEventListener() to listen for your custom event.


shouldn't you be importing CustomEventDispatcher class in your test file


event.value doesn't exist
try tracing event alone and see what you get
Pretty sure you need something like event.target.value

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜