CommandButton deaktivieren-Funktionalität, wenn inputText Validierung fehlschlägt oder ajax-call startet
Habe ich das folgende Stück code in einem Formular:
<p:panel id="panel" header="lalalala">
<h:panelGrid columns="5">
<h:outputLabel value="Enter name" for="name" />
<p:inputText id="name" value="#{userBean.name}"
required="true" label="name" maxlength="15"
validatorMessage="oops"
requiredMessage="ooopps">
<f:validateRegex
pattern="^somepattern$">
</f:validateRegex>
<p:ajax event="blur" update="inputValidationMessage" />
</p:inputText>
<p:message id="inputValidationMessage" showSummary="false"
for="name" />
<p:watermark for="name" value="eg. John" />
</h:panelGrid>
<p:commandButton id="submitButton" value="Submit" update="panel"
actionListener="#{userBean.save}"
onclick="handleOnclick"
oncomplete="handleAjaxResponse(xhr, status, args)">
</p:commandButton>
<p:messages autoUpdate="true" globalOnly="true" showDetail="true" />
</p:panel>
Also die Prüfmeldungen in der Arbeit auch auf die inputText
element. Aber der submit-button ist noch ein Ajax-request, wenn Sie geklickt werden, auch wenn die Eingabe ungültig ist. Ich möchte den Ajax-request gesendet werden, iff der inputText ist gültig.
Wie mache ich das?
Außerdem, es gibt einen anderen Fall würde ich gerne deaktivieren Sie die Schaltfläche. Dies ist der Fall, wo inputText ist validiert und der Benutzer auf die Schaltfläche klickt. Der Grund für dieses ist, weiß ich nicht möchten, dass der Benutzer versehentlich Flut von Anfragen. (ich.e drücken Sie wiederholt auf die Schaltfläche Absenden)
Derzeit, die handleOnclick
javascript-Funktion, die nur zeigt ein modales Dialogfeld sagt "warten". Da dieser dialog modal ist, wird der hintergrund nicht möglich ist. Jedoch, dass immer noch nicht verhindern, dass die Benutzer aus, und drücken Sie Sie wiederholt, weil 1 Sekunde vergeht zwischen onclick und modalen dialog angezeigt. Außerdem; dieser Ansatz nicht verhindern, dass die übermittlung Ungültiger Daten. Was können Sie vorschlagen?
Benutze ich JSF2.0 und Primefaces 3.0.
Jede Hilfe dankbar.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie mit der Taste s
disabled
Attribut für Sie. Einfachtrue
wennFacesContext#isPostback()
zurückfalse
(es ist also eine erste Anfrage), oder wenn estrue
(also ein form submit aufgetreten ist), dann überprüfen Sie, obFacesContext#isValidationFailed()
zurücktrue
(also die Validierung fehlgeschlagen in der Regel).Brauchen Sie nur, um sicherzustellen, dass Sie aktualisieren Sie die Taste auf ajax-Anfragen, so dass es wieder angezeigt, die entweder aktiviert oder deaktiviert werden, wenn nötig.
#{facesContext.postback}
überprüfen Sie dann.disabled="#{facesContext.validationFailed}"
jetzt. Das löst das problem, das ich erwähnt, aber das gleiche passiert, wenn die Validierung fehlschlägt. Ich laden Sie die Seite, geben Sie etwas ungültig, der button wird deaktiviert. Dann geben Sie mir etwas, das gültig ist, aber klicken müssen, um irgendwo anders zu aktivieren, die-Taste erneut. Nur dann kann ich klicken Sie auf die Schaltfläche. Was würden Sie vorschlagen, um zu verhindern, dass schlechte user experience in einem solchen Szenario?keyup
stattblur
, aber das werde dazu führen, dass mehr ajax-Anfragen. Alternativ, nur nicht, deaktivieren Sie die Schaltfläche an alle 🙂disabled
Attribut. Eine Letzte Sache; das onclick der Schaltfläche ruft eine Javascript-Funktion, die zeigt ein modales Dialogfeld. Seit der deaktiviert ist, entfernt wird, zeigt der dialog an, sowieso. Wie kann ich sagen, es popup-iff-Validierung erfolgreich? Ich konnte rufe diese Funktion aufonstart
stattonclick
aberonstart
dauert ein wenig Zeit, um Sie auszuführen. So 2 Sekunden vergehen aus dem klicken und der dialog zeigt, fühlt sich nicht mehr reagiert.visible="#{facesContext.postback and not facesContext.validationFailed}"
- und ajax-update statt. 2 Sekunden ist ziemlich viel, obwohl, ist es nicht nur Ihre business-Logik / DB Leistung / hardware, die ineffizient ist?O(1)
. Es läuft auf localhost und es gibt keine DB 🙂 Vielleicht ist es mein laptop oder so