2010-05-11 7 views
1

하나의 열에 간단한 사용자 정의 레이블 itemrenderer가있는 adobe flex DataGrid가 있습니다. itemrenderer를 클릭하면 서비스 호출이 발생하는 cairngorm 이벤트가 발생하고 서비스 호출의 데이터는 TitleWindow를 채 웁니다.Adobe Flex 이중 클릭 방지

doubleClickedEnabled 속성을 false로 설정 했더라도 항목 렌더러를 두 번 클릭하여 두 개의 서비스 호출을 만들고 두 개의 TitleWindow를 표시 할 수 있습니다. 다른 경우에는 트리플 클릭이 원하지 않는 결과를 유발하는 것 같습니다.

이런 종류의 동작을 방지 할 수있는 방법이 있습니까?

답변

2

클릭 이벤트가 발생하는 시점을 추적하고 일정 시간 (250ms) 내에 2 회 발생하면 두 번째 이벤트가 무시됩니다.

var lastTime:Date = new Date(0); 

function OnClickHandler(event:Event):void { 
    if ((new Date()).time - lastTime.time < 250) { 
     return; 
    } 
    lastTime = new Date(); 
    ... 
} 
+0

나는이 서비스를 모든 서비스 호출로 확장 할 수 있기 때문에이 방법을 정말 좋아한다. 서비스 호출이있을 때마다 lastTime, 메서드 및 서비스를 저장하는 바인딩 가능한 ServiceModel 싱글 톤을 만들었습니다. 그런 다음 serviceModel 매개 변수 (lastTime, method, service)를 현재 서비스 호출에 대해 확인하도록 baseDelegate를 수정했습니다. 동일한 메소드 및 서비스 이름과 시간이 500ms 미만인 경우에는 처리하지 않습니다. 이 문제에 대해 알려 주시겠습니까? – JonoB

+0

@ JonoB, 루프에서 동일한 서비스 메소드를 호출하는 합법적 인 이유가있는 경우 문제가 될 수 있습니다. 250ms 이내에 링크를 여러 번 클릭하는 합법적 인 이유가있는 사용자와 대조하면 이벤트 처리기에서 이렇게하는 것이 더 좋을 것 같습니다. –

+0

동일한 클라이언트에서 250 ~ 500ms 이내에 같은 서비스 요청을 한 경우는 발생하지 않습니다. 있다면, 아마 그 오류! 확실히 루프에는 서비스 호출이 없습니다. 나 또한 내 애플 리케이션에 많은 장소에서 이러한 단일 클릭 링크가 있고 wouldnt 정말 가서 그들 각각에 대한 이벤트 처리기를 만들고 싶어. – JonoB

0
// class variable section 
var lastTime:Date = null; 

... 

function handler(evt:Event):void{ 
    var currentTime = new Date(); 
    if (lastTime === null){ 
     lastTime = currentTime; 
    } else { 
     var diff = currentTime.milliseconds() - lastTime.milliseconds(); 
     if (diff <= 250) // try some other intervals to get best result for you. 
      return; 
     else 
      lastTime = currentTime; 
    } 
    ... the rest of your code. 
} 
+0

Nope. ** 처음 **, 이것은 간단한 작업을위한 많은 코드입니다. 단순화하십시오. ** 두 번째 **, '밀리 초'는 총 밀리 초가 아닌 현재 밀리 초 구성 요소를 반환하며 필요한 결과를 얻지 못합니다. ** 셋째 **, '밀리 초'는 메서드가 아닌 속성이므로 괄호는 없습니다. –

0

이 작업을 수행하는 가장 좋은 방법은 한 번 클릭 된 것을 주목하는 것이 당신의 itemRenderer에 플래그를 설정하는 것입니다. 이렇게하면 첫 번째 결과가 반환 될 때까지 다른 cairngorm 이벤트를 보내지 못하게됩니다. 플래그가 재설정되면 다시 클릭 할 수있게됩니다.

간략히하기 위해 다음 코드는 모든 것이 동일한 범위 내에서 발생한다고 가정합니다. 그렇지 않은 경우 itemRender와주고받는 이벤트를 다른 컨텍스트에서 보내고 받아야합니다. 이 서비스 호출을 보내는에서 더블 클릭을 방지하기 위해 작동합니다

[Bindable] 
var _clickEnabled:Boolean = true; 

private function doClickStuff() : void { 
    if (_clickEnabled) { 
    // fire your event 
    _clickEnabled = false; 
    } 
} 

private function onEventReturnHandler(event:Event) : void { 
    // do whatever it is you're going to do 
    _clickEnabled = true; 
} 
0

간단한 해결책은 단 한번의 클릭 이벤트와 같은 핸들러를 호출 더블 클릭을 활성화하고 더블 클릭 이벤트를하는 것입니다.

<s:Button label="Button" 
      click="clickHandler()" 
      doubleClick="clickHandler()" 
      doubleClickEnabled="true" /> 

물론 이것은 트리플 클릭을 방지하지 않지만 훨씬 덜 자주 발생하는 문제입니다.

2

좋아, 나도 잘 모르겠지만 두 번 클릭 이벤트를 방지하는 가장 쉬운 방법은 버튼에 doubleClickEnabled = "true"을 설정하고 doubleClick 이벤트에 아무 기능도 지정하지 않는 것입니다. 따라서 버튼은 두 번째 클릭을 인식하지만 단일 클릭 이벤트를 전달하지 않습니다. 희망이 그것은 이해가된다 - 나는 이것을 시험하고 나를 위해 일한다 :