2017-04-27 1 views
1

우리는 Wicket Wizard 구성 요소를 사용하고 있습니다. 마법사의 마지막 단계에서 사용자가 마침 버튼을 빠르게 클릭하면 Wicket은 onFinish() 메서드를 여러 번 호출합니다. 이것은 우리에게 문제를 일으킨다. 흥미롭게도 문제는 우리가 시도한 모든 브라우저 (IE, Chrome)에서 발생하지만 Firefox에서는 발생하지 않습니다. 이 브라우저는 여러 번의 클릭을 감지하고 하나의 클릭 이벤트 만 서버로 전송합니다.Wicket 7 - 마법사 완료 버튼으로 여러 onClick 이벤트가 생성됩니다.

질문 :이 문제를 방지하기 위해 우리가 할 수있는 일은 무엇입니까? Wicket 프레임 워크 코드를 살펴보면 탐색 버튼이 WizardButtonBar에 있고 FinishButtononClick 이벤트를 처리하고 있음을 알 수 있습니다. 그러나이 동작을 재정의하거나 제어하는 ​​방법이 확실하지 않으며 어떻게 든 감지합니다 복수형 onClick 이벤트

답변

0

당신은 Ajax를 사용하지 않는 것 같습니까?

만약 그렇게했다면 베일을 추가하면됩니다. #getAjaxIndicatorMarkupId()을 재정 의하여 모든 이중 제출이 금지됩니다. 추가 이점 : 마법사가 완료된 후 사용자가 뒤로 버튼을 누르면 브라우저가 마법사를 종료하고 사용자가 두 번째로 완료 할 수 없습니다.

비 Ajax 요청의 경우, 자신의 베일 자바 스크립트를 단추에 추가해야합니다.
사용자가 돌아가서 두 번째로 마법사를 마칠 수 없게하려면 토큰 기반 솔루션을 사용할 수 있습니다.
마법사 시작시 토큰을 얻을 수 있습니다 (카운터 일 수도 있음). 마법사가 끝나면 토큰을 소비 된 것으로 표시합니다 (예 : 도메인 개체에 저장).
마법사에 대한 각 요청에 대해 토큰이 유효한지 확인할 수 있습니다. 그렇지 않은 경우 마법사가 이미 완료되었다는 것을 설명하는 다른 페이지로 사용자를 리디렉션하십시오.

+0

감사합니다. Sven. 표준 Wicket Wizard 구성 요소를 사용하면됩니다. 여러분이 Ajax 지원 마법사를 제공 할 수 있다면 위대한 것입니다.) –

+0

이미 있습니다 : newButtonBar()를 오버라이드하고 AjaxWizardButtonBar를 반환하도록하십시오. – svenmeier

0

Andrew는 나에게 매우 친절하게 원래 질문을 제출했습니다. 내가 발견하는 onFinish이() 나는 마침 버튼, 을 누를만큼 여러 번 호출하지만 때마다 finishPressed 0 때입니다 것입니다,

class MyWizard extends Wizard { 

    private Integer finishPressed = -1; // deliberately set an invalid value to start with 

    public MyWizard() { 
     finishPressed = 0; // only place where finishedPressed is set to 0 
     log.info("init: finishPressed={}", finishPressed); 
    } 

    @Override 
    public void onFinish() { 
     log.info("begin: finishPressed={}", finishPressed); 
     if (! finishPressed) { 
      finishPressed += 1; 
      // do onFinish actions ... 
     } 
     log.info("end: finishPressed={}", finishPressed); 
    } 
} 

을하지만 : 나는 (거의 당신이 제안)이 일을 시도했다 카운트가 증가하는 대신 메쏘드에 들어갑니다.

참고 : 로그에는 "init : finishPressed = 0"번만 표시됩니다. 로그에 한 번만 표시됩니다. 어떻게 0으로 리셋 점점 계속 모르겠다. 그러나 onFinish() 호출 매번 다른 스레드에 의해 처리 된 것을 알았어. 하지만 말했듯이 생성자 (finishPressed가 0으로 설정된 유일한 장소)는 한 번만 호출되었습니다.

finishPressed를 static으로 선언하면 (실제로 실제 작동에서 문제가 발생할 것임) 예상대로 finishPressed가 증가하는 것을 볼 수 있습니까?

관련 문제