0

액션 스크립트 : 이벤트 리스너를 자동화 된 방식으로 바인딩 할 때 목록의 마지막 리스너 만 기능합니다.

다음은 코드의 일부입니다.

protected function handleTriggers(raw:Object) : void 
{ 
    var name:String, value:String, map:Object; 

    map = { 
      'onclick':  MouseEvent.CLICK, 
      'ondblclick': MouseEvent.DOUBLE_CLICK, 
      'onmousedown': MouseEvent.MOUSE_DOWN, 
      'onmouseup': MouseEvent.MOUSE_UP, 
      'onmouseleave': MouseEvent.ROLL_OUT, 
      'onrollout': MouseEvent.ROLL_OUT, 
      'onmouseenter': MouseEvent.ROLL_OVER, 
      'onrollover': MouseEvent.ROLL_OVER, 
      'onmouseover': MouseEvent.MOUSE_OVER, 
      'onmouseout': MouseEvent.MOUSE_OUT, 
      'onmousemove': MouseEvent.MOUSE_MOVE 
    }; 

    for (name in raw) 
    { 
     value = raw[name]; 
     if (name in map) { 
      var cloneValue:String = value; 
      object.addEventListener(map[name], function(event:* = null) : void { 
       execute(cloneValue, event); 
      }); 
     } 
    } 
} 

object는 일반 DisplayObject이며 raw 객체에는 일련의 onclick, onmouseover 등의 이벤트 트리거가 포함되어 있습니다. 이는 해당 원시 객체의 속성을 자동으로 따라가는 이벤트 리스너를 첨부 할 수 있다는 의미였습니다. 그리고 그것이 실제로 작동하는 것처럼 보입니다. 실제로 listener 함수에서 일부 Listener 함수를 볼 수 있습니다. DisplayObject의 속성 및 해당 숫자는 트리거 수에 해당합니다. 그러나 나중에 모든 것이 무대에 올 때 마지막 이벤트 처리기 만 트리거됩니다.

왜 그런 일이 일어날 지 아무도 모른다.

답변

2

문제는 this one.과 비슷합니다. 이벤트 목록 수신기로 인라인 함수를 추가 했으므로 clonevalue은 항상 마지막 값의 값이 raw입니다.

object.addEventListener(map[name], function(cloneValue : String) : Function { 
    return function(event:* = null) : void { 
     execute(cloneValue, event); 
    }; 
})(cloneValue); 
+0

그것은 작동하지 않았다, 그러나 나는 점을 가지고, 그래서 난 그냥 별도의 기능에서 addEventListener 논리를 이동하고 일 :

나는이 (테스트되지 않은) 작업을한다고 생각합니다. 감사. 귀하가 귀하의 응답을 편집하거나 확인하는 경우, 귀하는이를 적절한 것으로 수락 할 것입니다. – jayarjo

+0

cloneValue 함수를 param으로 호출하는 것을 잊었습니다;) 이제는 작동해야합니다 ... – maxmc