addEventListener 끝에 var를 전달할 수 있습니까?as3 addEventListener - 함수에서 변수 전달?
/// clickType declared elsewhere in code.
checkBoxFast.addEventListener(clickType, goFast("yes"));
function goFast(evt:Event=null,myVar:String)
{
trace(myVar);
}
addEventListener 끝에 var를 전달할 수 있습니까?as3 addEventListener - 함수에서 변수 전달?
/// clickType declared elsewhere in code.
checkBoxFast.addEventListener(clickType, goFast("yes"));
function goFast(evt:Event=null,myVar:String)
{
trace(myVar);
}
또 다른 해결책은 이렇게 같은 anonymous function을 사용하는 것입니다 :
여기checkBoxFast.addEventListener(clickType, function(e:Event):void{goFast("yes")});
function goFast(myVar:String)
{
trace(myVar);
}
익명의 기능은 이벤트 리스너입니다. 거대한 메모리 누출 원인. 익명의 기능을 가진 removeEventListener는 불가능합니다. –
@MaxGolovanchuk 사실이 아닙니다. 이벤트 핸들러가 한 번만 실행되면, 익명 함수 안에'IEventDispatcher (e.currentTarget) .removeEventListener (e.type, arguments.callee);'를 추가 할 수 있습니다. 그것이 여러 번 사용될 예정이라면 거기에 부울을 추가하여 다시 추가 할지를 결정하십시오. 이벤트 리스너를 관리 할 수있는 많은 이벤트 매니저가 있습니다. 올바른 사용법은 이벤트 리스너와 메모리 누수와 같은 익명의 함수를 훨씬 잘 처리 할 수 있습니다. 나는 내가 저술하려고하는 책을 썼다. 내가 할 때 여기에 링크를 공유합니다. –
@Amit Dvir. 익명의 함수는 악의적인데, 클로저로 사용할 수 있고 객체 내부의 변수에 대한 참조를 포함하기 때문에 둘러싸는 것이므로 GC가 객체를 지우지 못하게합니다. :) 익명 함수 내부에 제거 기능을 추가하는 것은 해결책이 아닙니다. 익명 함수가 아닌 다른 곳에서 함수를 제거하려면 어떻게해야합니까? 이벤트 매니저 (Event Manager) - 간단한 이벤트 처리를 위해 커스텀 매니저를 사용하는 것은 약간 과잉입니다. –
이벤트 전달을 매개 변수화하려는 경우 변수에 이벤트를 전달하는 것이 좋습니다.
-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);
}
맞춤 이벤트를 만드는 것이 가장 좋은 방법입니다. 하지만 때로는 다른 aproach를 사용하고있었습니다. 나는 그것이 좋은 습관인지는 모르지만 어떤 경우에는 효과가있다.
public function test() {
var myVar : String = "some value";
addEventListener(MouseEvent.CLICK, onClick);
function(e:Event){
trace(myVar);
}
}
꽤 깨끗한 방법 :
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를 참조하십시오.
이 질문을보십시오. http://stackoverflow.com/questions/12590082/how-to-dispatch-an-event-with-added-data-as3/12590659#comment16968983_12590659 – BadFeelingAboutThis