2017-04-27 2 views
1

Wir verwenden die Komponente Wicket Wizard. Im letzten Schritt des Assistenten finden wir, dass, wenn der Benutzer schnell auf die Schaltfläche zum Beenden klickt, Wicket unsere Methode onFinish() mehrmals aufruft. Dies verursacht Probleme für uns. Interessanterweise tritt das Problem in allen Browsern auf, die wir ausprobiert haben (IE, Chrome), nicht jedoch in Firefox. Dieser Browser scheint mehrere Klicks zu erkennen und sendet nur ein Klickereignis an den Server.Wicket 7 - Schaltfläche "Wizard finish" generiert mehrere onClick-Ereignisse

Frage ist, was können wir tun, um dies zu verhindern? Aus dem Blick auf den Wicket-Framework-Code kann ich sehen, dass die Nav-Tasten in einer WizardButtonBar enthalten sind, und die FinishButton behandelt die onClick Ereignis, aber ich bin mir nicht sicher über die richtige Art und Weise zu überschreiben oder dieses Verhalten zu kontrollieren, und irgendwie zu erkennen die multiple onClick events

Antwort

0

Sie scheinen nicht Ajax zu verwenden, oder?

Wenn Sie das getan haben, könnten Sie einfach einen Schleier hinzufügen - z. durch Überschreiben #getAjaxIndicatorMarkupId() - und jede doppelte Übermittlung würde verhindert werden. Zusätzlicher Vorteil: Wenn der Benutzer nach Abschluss des Assistenten die Zurück-Taste gedrückt hat, verlässt der Browser den Assistenten und der Benutzer kann ihn nicht ein zweites Mal beenden.

Für Nicht-Ajax-Anforderungen müssen Sie Ihr eigenes Schleier-JavaScript zu Ihrer Schaltfläche hinzufügen.
Um zu verhindern, dass der Benutzer zurückgeht und den Assistenten ein zweites Mal beendet, können Sie eine Token-Basis-Lösung verwenden: Am Anfang des Assistenten erwerben Sie ein Token (könnte nur ein Zähler sein). Sobald der Assistent fertig ist, markieren Sie das Token als verbraucht (z. B. speichern Sie es entlang Ihrer Domain-Objekte).
Bei jeder Anforderung an den Assistenten können Sie überprüfen, ob das Token noch gültig ist. Wenn nicht, leiten Sie den Benutzer auf eine andere Seite weiter, in der Sie erklären, dass der Assistent bereits beendet wurde.

+0

Danke Sven. Verwenden Sie einfach die Standard-Wicket-Wizard-Komponente. Wenn ihr einen Ajax-fähigen Assistenten zur Verfügung stellen könntest, wäre das großartig. –

+0

Er ist bereits da: überschreiben Sie newButtonBar() und lassen Sie eine 'AjaxWizardButtonBar' zurück. – svenmeier

0

Andrew legte sehr freundlich die ursprüngliche Frage für mich. Ich habe versucht, dies zu tun (so ziemlich wie Sie vorgeschlagen):

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); 
    } 
} 

Doch was ich finde, ist, dass OnFinish() so oft genannt wird, wie ich auf die Schaltfläche Fertig gedrückt, aber jedes Mal finishPressed 0 ist, wenn es tritt die Methode ein, anstatt die Zählung zu erhöhen.

Hinweis: Ich sehe nur "init: finishPressed = 0" einmal im Protokoll. Ich weiß nicht, wie es immer auf 0 zurückgesetzt wird. Ich habe jedoch bemerkt, dass die onFinish() - Aufrufe jedes Mal von einem anderen Thread behandelt wurden. Aber wie gesagt, der Konstruktor (der einzige Platz, den finishPressed auf 0 gesetzt hat) wurde nur einmal aufgerufen.

Nur wenn ich finishPressed als statisch deklariere (was natürlich Probleme im realen Betrieb verursacht), sehe ich, dass finishPressed wie erwartet inkrementiert wird.

Verwandte Themen