Minimaler Beispieldialog:
<p:dialog header="Test Dialog"
widgetVar="testDialog">
<h:form>
<p:inputText value="#{mbean.someValue}"/>
<p:commandButton value="Save"
onsuccess="testDialog.hide()"
actionListener="#{mbean.saveMethod}"/>
</h:form>
</p:dialog>
Ich möchte in der Lage sein, die mbean.saveMethod irgendwie daran zu hindern, den Dialog zu schließen, wenn es ein Problem gab, und eine Nachricht nur durch Knurren auszugeben. Dies ist ein Fall, in dem ein Validator nicht hilft, da nicht festgestellt werden kann, ob someValue gültig ist, bis ein Speicher an einen Back-End-Server gesendet wird. Derzeit mache ich dies mit dem sichtbaren Attribut und zeige es auf ein boolesches Feld in mbean. Das funktioniert, aber es macht die Benutzeroberfläche langsamer, da das Auf- oder Abblättern des Dialogfelds das Drücken des Servers erfordert.
quelle
oncomplete="if(args && !args.validationFailed)
das ist meine Art es zu tun. istnull
Check in meinem Code unnötige?Ich habe gerade diese Lösung gegoogelt . Grundsätzlich besteht die Idee darin, actionListener anstelle der Aktion der Schaltfläche zu verwenden. In der Backing-Bean fügen Sie einen Rückrufparameter hinzu, der dann in der Oncomplete-Methode der Schaltfläche überprüft wird. Beispielteilcode:
JSF zuerst:
<p:commandButton actionListener="#{myBean.doAction}" oncomplete="if (!args.validationFailed && args.saved) schedulesDialog.hide();" />
Backing Bean:
public void doAction(ActionEvent actionEvent) { // do your stuff here... if (ok) { RequestContext.getCurrentInstance().addCallbackParam("saved", true); } else { RequestContext.getCurrentInstance().addCallbackParam("saved", false); } }
Hoffe das hilft jemandem :)
quelle
Die Verwendung des
oncomplete
Attributs über Ihre Befehlsschaltfläche und eines wirklich einfachen Skripts hilft Ihnen sehr.Ihr Dialog und Ihre Befehlsschaltfläche sehen ungefähr so aus:
<p:dialog widgetVar="dialog"> <h:form id="dialogView"> <p:commandButton id="saveButton" icon="ui-icon-disk" value="#{ui['action.save']}" update=":dataList :dialogView" actionListener="#{mbean.save()}" oncomplete="handleDialogSubmit(xhr, status, args)" /> </h:form> </p:dialog>
Und das Skript wäre ungefähr so:
<script type="text/javascript"> function handleDialogSubmit(xhr, status, args) { if (args.validationFailed) { dialog.show(); } else { dialog.hide(); } } </script>
quelle
Ich benutze diese Lösung:
JSF-Code:
<p:dialog ... widgetVar="dlgModify" ... > ... <p:commandButton value="Save" update="@form" actionListener="#{AdminMB.saveTable}" /> <p:commandButton value="Cancel" oncomplete="PF('dlgModify').hide();"/>
Backing Bean Code:
public void saveTable() { RequestContext rc = RequestContext.getCurrentInstance(); rc.execute("PF('dlgModify').hide()"); }
quelle
Ich glaube, das ist die sauberste Lösung. Dazu müssen Sie den Schaltflächencode nicht ändern . Diese Lösung überschreibt den Prototyp der Funktion "Ausblenden".
$(document).ready(function() { PrimeFaces.widget.Dialog.prototype.originalHide = PrimeFaces.widget.Dialog.prototype.hide; // keep a reference to the original hide() PrimeFaces.widget.Dialog.prototype.hide = function() { var ajaxResponseArgs = arguments.callee.caller.arguments[2]; // accesses oncomplete arguments if (ajaxResponseArgs && ajaxResponseArgs.validationFailed) { return; // on validation error, prevent closing } this.originalHide(); }; });
Auf diese Weise können Sie Ihren Code wie folgt behalten:
<p:commandButton value="Save" oncomplete="videoDetalheDialogJS.hide();" actionListener="#{videoBean.saveVideo(video)}" />
quelle
Die einfachste Lösung besteht darin, kein "widget.hide" zu haben, weder in onclick noch in oncomplete. Entfernen Sie die Versteckfunktionen und setzen Sie sie einfach ein
visible="#{facesContext.validationFailed}"
für das Dialog-Tag
quelle