2012-09-28 4 views
2

addEventListener 끝에 var를 전달할 수 있습니까?as3 addEventListener - 함수에서 변수 전달?

/// clickType declared elsewhere in code. 
checkBoxFast.addEventListener(clickType, goFast("yes")); 

function goFast(evt:Event=null,myVar:String) 
{ 
trace(myVar); 
} 
+0

이 질문을보십시오. http://stackoverflow.com/questions/12590082/how-to-dispatch-an-event-with-added-data-as3/12590659#comment16968983_12590659 – BadFeelingAboutThis

답변

1

또 다른 해결책은 이렇게 같은 anonymous function을 사용하는 것입니다 :

여기
checkBoxFast.addEventListener(clickType, function(e:Event):void{goFast("yes")}); 

function goFast(myVar:String) 
{ 
    trace(myVar); 
} 
+0

익명의 기능은 이벤트 리스너입니다. 거대한 메모리 누출 원인. 익명의 기능을 가진 removeEventListener는 불가능합니다. –

+0

@MaxGolovanchuk 사실이 아닙니다. 이벤트 핸들러가 한 번만 실행되면, 익명 함수 안에'IEventDispatcher (e.currentTarget) .removeEventListener (e.type, arguments.callee);'를 추가 할 수 있습니다. 그것이 여러 번 사용될 예정이라면 거기에 부울을 추가하여 다시 추가 할지를 결정하십시오. 이벤트 리스너를 관리 할 수있는 많은 이벤트 매니저가 있습니다. 올바른 사용법은 이벤트 리스너와 메모리 누수와 같은 익명의 함수를 훨씬 잘 처리 할 수 ​​있습니다. 나는 내가 저술하려고하는 책을 썼다. 내가 할 때 여기에 링크를 공유합니다. –

+0

@Amit Dvir. 익명의 함수는 악의적인데, 클로저로 사용할 수 있고 객체 내부의 변수에 대한 참조를 포함하기 때문에 둘러싸는 것이므로 GC가 객체를 지우지 못하게합니다. :) 익명 함수 내부에 제거 기능을 추가하는 것은 해결책이 아닙니다. 익명 함수가 아닌 다른 곳에서 함수를 제거하려면 어떻게해야합니까? 이벤트 매니저 (Event Manager) - 간단한 이벤트 처리를 위해 커스텀 매니저를 사용하는 것은 약간 과잉입니다. –

1

이벤트 전달을 매개 변수화하려는 경우 변수에 이벤트를 전달하는 것이 좋습니다.

-Create 맞춤 이벤트 :

public class MyEvent extends Event { 
    public var myVar:String; 

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

-Dispatch 필요한 변수 이벤트 발송자로부터 이벤트 :

var event:MyEvent = new MyEvent("eventType"); 
event.myVar = "yes"; 

dispatchEvent(event); 

- 추가 이벤트 핸들러 :

checkBoxFast.addEventListener("eventType", eventHandler); 

protected function eventHandler(event:MyEvent):void { 
trace(event.myVar); 
} 
0

맞춤 이벤트를 만드는 것이 가장 좋은 방법입니다. 하지만 때로는 다른 aproach를 사용하고있었습니다. 나는 그것이 좋은 습관인지는 모르지만 어떤 경우에는 효과가있다.

public function test() { 

     var myVar : String = "some value"; 
     addEventListener(MouseEvent.CLICK, onClick); 


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

    } 
1

꽤 깨끗한 방법 :

checkBoxFast.addEventListener(clickType, goFast("yes")); 

function goFast(myVar:String) {return function(e:Event) { 
    trace(myVar); 
}} 

하지만 는 익명 함수 조심, 그들은하지 않습니다 그것이 만들어진 같은 장소에서 청취자를 끝내십시오! 응용 프로그램에서 여러 번 반복하는 경우 계속 느려지거나 멈출 수 있습니다.

사실, 난 정말이처럼을 수행 할 것이 좋습니다

var functionGoFast:Function = goFast("yes"); 
checkBoxFast.addEventListener(clickType, functionGoFast); 

function goFast(myVar:String):Function { 
    return function(evt:Event = null):void { 
    trace(myVar); 
    } 
} 

//checkBoxFast.removeEventListener(clickType, functionGoFast); 

이 귀하의 경우에 더 많은 예제와 설명에 대한 this answer를 참조하십시오.

관련 문제