2014-04-21 3 views
0

나는 팝업을 표시하고 사용자의 입력을 받아이 사용자 정의 이벤트 핸들러가 :폐쇄 4.6

 private var mySkinnablePopupContainer:MySkinnablePopupContainer; 

     private function handleShowGridPopupEvent(event:ShowGridPopupEvent):void { 

       var mouseDownOutSideHandler:Function = function(mdEvent:FlexMouseEvent):void { 
        // At this point, event.targetControl contains the wrong object (usually the previous targetControl) 
        if (mdEvent.relatedObject != event.targetControl) {       
          mySkinnablePopupContainer.close(); 
        } 
       } 

       var gridPopupSelectionHandler:Function = function(popEvent:PopUpEvent):void { 
        if (!popEvent.commit) return;       
        // At this point, event.targetData contains the wrong object (usually the previous targetData) 
        myModel.doSomethingWithData(popEvent.data.selectedItem, event.targetData); 
       } 

       if (!mySkinnablePopupContainer) { 
        mySkinnablePopupContainer = new MySkinnablePopupContainer();      
        mySkinnablePopupContainer.addEventListener(PopUpEvent.CLOSE, gridPopupSelectionHandler); 
        mySkinnablePopupContainer.addEventListener(FlexMouseEvent.MOUSE_DOWN_OUTSIDE, mouseDownOutSideHandler); 
       } 

       // At this point, event.targetData contains the correct object   
       mySkinnablePopupContainer.dataProvider = getMyDPArrayCollection(event.targetData); 
       mySkinnablePopupContainer.open(this); 

       var point:Point = event.targetControl.localToGlobal(new Point());    
       mySkinnablePopupContainer.x = point.x + event.targetControl.width - mySkinnablePopupContainer.width; 
       mySkinnablePopupContainer.y = point.y + event.targetControl.height;                        
     } 

기능 핸들러가 호출 될 때마다, 올바른 ShowGridPopupEvent 개체가되지만 의해를 gridPopupSelectionHandler를 호출하면 이전 호출의 이전 객체가 포함됩니다. 처음으로 작동하고 후속 호출이 실패합니다. 어쨌든 이벤트 객체에 대한 참조가 팝업을 열기 전과 후에 팝업 어딘가 사이에서 변경되었습니다. 내가 뭘 잘못 생각하고 있니? 이것은 flex가있는 버그입니까?

+1

나에게 스코핑 문제가있는 것 같습니다. 내 머리 꼭대기에서 : 나는 외부 함수 범위에있는 두 변수에 대한 참조를 만들고이를 대신 (var data : MyData = event.targetData;) 액세스하는 것으로 충분하다고 생각합니다. 이 코딩 스타일 (중첩 된 이벤트 핸들러 및 모두)을 사용하면 코드를 읽고 디버그하기가 어려워지고 (b) 이러한 유형의 범위 지정 문제가 발생하기 쉽습니다. – RIAstar

답변

0

가 prob를 찾았습니다. 리스너를 한 번만 붙이기 때문에 이전 데이터를 참조하여 이전 리스너를 참조합니다. 나는 내가 그 closure를 만들 때마다 그 참조가 업데이트 될 것으로 기대하고 있었다고 생각한다. 이 경우가 아닙니다. 가능한 수정은 리스너를 제거하고 다시 추가하는 것이지만 closure를 사용하는 아이디어를 포기하고 RIAStar가 언급 한 것과는 별도로 핸들러를 호출 할 때마다 새로운 함수를 작성함으로써 더 많은 오버 헤드를 줄뿐 아니라 비실용적입니다. .