JSF Dialog nur nach erfolgreicher Action schließen

miketech

Bekanntes Mitglied
Hallo zusammen,

ich habe bei mir in einer Anwendung einen Dialog, den ich anzeige. Innerhalb des Dialogs ist ein Button, der eine Methode aufruft, ist quasi der Submit-Button für den Dialog. Nun möchte ich, dass abhängig davon, was die Methode als Ergebnis liefert, der Dialog wieder geschlossen wird.

Ich kann ja nun mit einem:

Java:
action="#{myBean.myMethod}"

die Methode aufrufen, wenn der Button geklickt wird. Und ich kann mit einem:

Java:
onClick="dialog.hide()"

den Dialog schließen lassen. Nur wie bekomme ich nun die zwei Dinge zusammen, dass abhängig davon, was myMethod liefert, der Dialog geschlossen wird? Typisches Beispiel:

Ein Dialog, in dem man eine neue Datei erzeugt, man hat einen Button "Speichern". Wenn die Datei schon existiert, darf der Dialog nicht geschlossen werden, sondern es wird eine Fehlermeldung angezeigt. Wenn die Datei noch nicht existiert, dann wird die Datei erstellt, gespeichert und der Dialog geschlossen. So etwas versuche ich umzusetzen.

Hat jemand eine Idee, wie ich hier vorgehe?

Viele Grüße

Mike
 
in der action method deiner Bean eine FacesMessage Fehlermeldung erstellen und im handler

für Richfaces:
Java:
<a4j:commandButton
oncomplete="if( !(#{not empty facesContext.messageList}) )dialog.hide();"/>

für Primefaces
Java:
<p:commandButton
oncomplete="handleComplete(xhr, status, args)" />

<script type="text/javascript">  
				function handleComplete(xhr, status, args) {  
				    if(!args.validationFailed) {  
				       dialog.hide();
				    } 
				}  
			</script>
oder



verwenden.

PS: Nächste macht bitte auch die Lib die verwendest angeben. (Du verwendest wahrscheinlich primefaces?)
 
Hallo Jim,

ja, es ist Primefaces, gut geschätzt 🙂

Danke für die Tipps, wusste nicht, dass es solche schönen Javascript-Möglichkeiten mit Primefaces gibt (die Argumente args etc.). Dann versuche ich das mal.

Über die Messages wird schwer, weil auch im erfolgreichen Fall eine Message ausgegeben wird, daher ist die Variante mit der Validation ganz elegant.

Viele Grüße

Mike
 
Hi,

eine andere Möglichkeit wäre in der action Methode deiner Bean:

Java:
public void delete(){
try{
....
}catch(Exception e){

	RequestContext.getCurrentInstance().addCallbackParam("validationFailed", true);
}
}

und dann im button.

Java:
<a4j:commandButton
oncomplete="if (!args.validationFailed){ dialog.hide();}"/>

Greetz
 

Zurück
Oben