문제

따라서 클로저 메모리 누출을 만들지 않고 데이터를 전달할 수 있도록 이벤트를 설정하는 방법을 원합니다. 이것은 내가 가진 한 다음과 같습니다.

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]

내 목표는 내가 발사 한 것뿐만 아니라 이벤트 플래시 화재에서 전달되기 위해 통과하려는 사용자 정의 데이터를 얻는 것입니다. 예를 들어, Loader.complete 이벤트와 함께 Movieclip을 전달하여 결과 비트 맵을 넣으려면 어떻게해야합니까?

도움이 되었습니까?

해결책

추가 데이터로 발송하기 위해 이벤트 클래스를 확장했습니다. 이제 로더 클래스가 사용자 정의 이벤트 유형을 발송하려면 로더 클래스를 확장하여 (또는이를 수행하려는 다른 클래스). 이 예에서는이 기능으로 urlloader를 무시할 것입니다 (로더는 실제로 두 개의 재정의 클래스가 필요한 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
}

멍청이! 선천적으로 파견 된 이벤트에 대한 사용자 정의 데이터!

다른 팁

다음은 사용자 정의 이벤트를 만드는 가장 깨끗한 방법을 보여줍니다. 일반적으로 이벤트 유형에는 모든 국회 의사당 문자에 공개 정적 참조가 입력되었습니다. 이벤트가 발송되면 이벤트 또는 customevent가 이벤트 핸들러 메소드에 반대합니다. 전달 된 값을 검색 할 수있는 곳입니다.

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