Потеряно с отправкой события на класс CustomEvent - PullRequest
0 голосов
/ 15 ноября 2009

Это цель, которую я пытался достичь, но безуспешно. У меня есть простой SWF с именем "btn.swf". У него есть кнопка, и при нажатии она отправляет событие своему родительскому «Основному приложению»;

Затем я написал класс CustomEvent, который распространяется на btn.swf. Btn.swf создает экземпляр CustomEvent и отправляет событие.

Чтобы загрузить SWF-контент в «Основное приложение», я написал CustomLoader, который расширяет класс Sprite. CustomLoader загружает контент в «Главное приложение».

Я не могу отследить отправленное событие в «Основном приложении». Я потратил на это день и теперь почти исчерпал все, что мог придумать. Я был бы очень признателен за любую помощь с этим, пожалуйста.

Позвольте мне напомнить мой класс Структура:

BtnClass расширяет класс CustomEvent. Btn Class отправляет событие BtnClass затем публикуется как btn.swf.

Класс CustomLoader используется классом CustomMain для загрузки btn.swf и перехвата отправленного события с помощью btn.swf.

Отправленное событие где-то теряется в переводе. Возможно, я подхожу ко всему неправильно, возможно.

Вот классы:
CustomEvent класс

package com.apps.comps.btn
{
    import flash.events.*;

    public class CustomEvent extends Event
    {
        public var data:*;

        public static const BUBBLE_UP:String = 'BubbleUp';

        public function CustomEvent(type:String, customData:Object, bubbles:Boolean=false, cancelable:Boolean=false)
        {
            super(type, bubbles, cancelable);
            this.data = customData;
        }

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

        override public function toString():String
        {
            return formatToString('CustomEvent', 'type', 'data', 'bubbles', 'cancelable');
        }
    }
}

BtnMain класс

package com.apps.comps.btn
{
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.errors.*;
    import fl.controls.*;

    public class BtnMain extends Sprite
    {
        public var evt:CustomEvent;
        public var obj:Object = {name:'JOHN', game:'RUNNING'};
        public var data:*;

        public function BtnMain()
        {
            trace("BTN MAIN INIT");
            createBtn();
        }

        public function createBtn():void
        {
            var btn:Button = new Button();
            btn.label = 'CLICK ME';
            btn.x = btn.y = 200;
            btn.addEventListener(MouseEvent.CLICK, btnHandler);
            addChild(btn);
        }

        public function btnHandler(e:MouseEvent):void
        {
            evt = new CustomEvent(CustomEvent.BUBBLE_UP, obj, false, false);
            this.dispatchEvent(evt);
            trace('...');
        }
    }
}

CustomLoader класс

package com.apps.comps
{
    import flash.display.*;
    import flash.net.*;
    import flash.events.*;
    import com.apps.comps.*;

    public class CustomLoader extends Sprite
    {
        // URLLoader already has a data property, so I used extraData
        private var _path:String;
        public var _ldr:Loader;
        public var eData:*;

        public function CustomLoader($path:String)
        {
            this._path = $path;
            loadContent(this._path);
        }       

        private function loadContent(e:String):void
        {
            this._ldr = new Loader();
            this._ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, progressHandler);
            this._ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler);
            this._ldr.load(new URLRequest(e));
        }

        private function progressHandler(e:ProgressEvent):void
        {
            var percent:uint = Math.round((e.bytesLoaded / e.bytesTotal) * 100);
            trace(percent);
        }

        private function onCompleteHandler(e:Event)
        {
            e.target.dispatchEvent('BubbleUp');
            this._ldr.contentLoaderInfo.addEventListener(CustomEvent.BUBBLE_UP, vHandler);
        }       

        public function vHandler(e:CustomEvent):void
        {
            trace(e);
        }

        override public function dispatchEvent(event: Event) : Boolean
        {
            var customEvent: CustomEvent = new CustomEvent(event.type, extraData, event.bubbles, event.cancelable);
            return super.dispatchEvent(customEvent);
        }

    }
}

CustomMain класс

package com.apps.comps
{
    import flash.display.*;
    import flash.events.*;
    import flash.net.*;
    import flash.errors.*;
    import com.apps.comps.*;

    public class CustomMain extends Sprite
    {
        var custLdr:CustomEvent;
        var obj:Object = {name:'SUPERMAN', game:'FLYING'};

        public function CustomMain()
        {
            //custLdr = new CustomLoader('movies/btn.swf');
            //addChild(custLdr);
            this.dispatchEvent(CustomEvent(obj));           
            this.addEventListener(CustomEvent.BUBBLE_UP, vHandler);

        }

        function vHandler(e:Event):void
        {
            trace('TARZAN');
        }

    }
}

Спасибо.

Ответы [ 2 ]

0 голосов
/ 09 января 2014

Вы почти на месте, вам просто нужно послушать объект, который отправляет. Поэтому в вашем основном классе обратитесь к вашему BtnMain и добавьте к нему addEventListener.

package com.apps.comps
{
import flash.display.*;
import flash.events.*;
import flash.net.*;
import flash.errors.*;
import com.apps.comps.*;

public class CustomMain extends Sprite
{
    var custLdr:CustomEvent;
    var obj:Object = {name:'SUPERMAN', game:'FLYING'};

    public function CustomMain()
    {
        var btnMain:BtnMain = new BtnMain();
        addChild(btnMain);

        /* This is the line you need */
        btnMain.addEventListener(CustomEvent.BUBBLE_UP, vHandler);

    }

    function vHandler(e:Event):void
    {
        trace('TARZAN');
    }

}
}
0 голосов
/ 10 января 2013

Похоже, что в BtnMain.as вы не настраиваете всплывающее событие, поэтому CustomLoader не получит его. Попробуйте изменить эту строку в btnHandler, чтобы установить для пузырьков значение true:

evt = new CustomEvent(CustomEvent.BUBBLE_UP, obj, true, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...