كيف يمكنني تعديل أحداث AS3 الحالية حتى أتمكن من اجتياز البيانات؟

StackOverflow https://stackoverflow.com/questions/758322

سؤال

لذلك أريد طريقة لإعداد الأحداث حتى أتمكن من اجتياز البيانات دون إنشاء إغلاق تسرب الذاكرة. هذا بقدر ما حصلت عليه:

package com.events {
    import flash.events.Event;

    public class CustomEvent extends Event {
        public static const REMOVED_FROM_STAGE:String = "removedFromStage";
        public var data:*;

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

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

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

هذا يحصل لي السلوك التالي:

function testme(e:Event) {
    trace(e); 
}

test_mc.addEventListener(CustomEvent.REMOVED_FROM_STAGE, testme);
test_mc.dispatchEvent(new CustomEvent(CustomEvent.REMOVED_FROM_STAGE, 42));
//Traces [CustomEvent type="removedFromStage" data=42 bubbles=false cancelable=false eventPhase=2]
removeChild(test_mc);
//Traces [Event type="removedFromStage" bubbles=false cancelable=false eventPhase=2]

هدفي هو الحصول على البيانات المخصصة التي أرغب في نقلها للحصول على مرت من حرائق فلاش الحدث، وليس فقط الشخص الذي أطلقه. على سبيل المثال، ماذا لو كنت أرغب في تمرير Movieclip جنبا إلى جنب مع حدث Loader.comPlete لوضع النقطات النقطية الناتجة؟

هل كانت مفيدة؟

المحلول

قمت بإرسال فئة الحدث إليها لإرسال بيانات إضافية، الآن إذا كنت ترغب في إرسال فئة Loader إلى نوع الحدث المخصص الخاص بك، قم بتوسيع فئة Loader للقيام بذلك (أو أي فئة أخرى تريد القيام بذلك بها). في هذا المثال، سأجمل Urlloader باستخدام هذه الوظيفة (لأن Loader فعلا إرسال الأحداث من ContentloaderInfo، والتي تحتاج إلى فئات تجاوزتان، وأريد فقط أن أبقيها بسيطة)


package com.net
{
    import flash.net.URLLoader;
    import flash.events.Event;

    import com.events.CustomEvent;

    public class CustomLoader extends URLLoader
    {
        // URLLoader already has a data property, so I used extraData
        public var extraData:*;

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

الآن لاستخدام هذا مع فئة customevent جرب هذا الرمز في .fla الخاص بك


import com.net.CustomLoader;
import com.events.CustomEvent;

var loader: CustomLoader = new CustomLoader();
loader.extraData = "Extra Data";
loader.load(new URLRequest("test.xml"));
loader.addEventListener(Event.COMPLETE, loadComplete);

function loadComplete(event: CustomEvent) : void
{
    trace(event.data); // Extra Data
}

بام! بيانات مخصصة على أحداثك المرسلة بطبقة!

نصائح أخرى

ويبين ما يلي أنظف طريقة لإنشاء حدث مخصص. عادة ما تحتوي أنواع الأحداث المراجع الثابتة العامة على جميع أحرف الكابيتول. عند إرسال حدث، يمر حدثا، أو كوعك، كائن إلى طريقة معالج الأحداث. هذا هو المكان الذي يمكنك استرداد قيمتك المنقولة.

package com.hodgedev.events 
{
    import flash.events.Event;

    public class CustomEvent extends Event 
    {
        public static const VALUE_CHANGED:String = "VALUE_CHANGED";
        public var value:Number;

        public function CustomEvent(pValue:Number) 
        { 
            super(CustomEvent.VALUE_CHANGED);
            value = pValue;
        } 
        public override function clone():Event 
        { 
            return new CustomEvent(value);
        }
    }
}

عندما نرسل الأحداث، نقوم بإنشاء مثيل جديد للحدث الذي يجب تمريره على هذا النحو.

private var _someValue:int = 12;
dispatchEvent(new CustomEvent(_somevalue));
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top