jsf-2 - elementos - jsf tutorial español
Cómo encontrar una indicación de un error de validación(requerido="verdadero") mientras se ejecuta el comando ajax (3)
Tengo un formulario dentro de un diálogo que cierro haciendo clic en el botón de comando con ajax,
Me gusta esto
<h:commandButton value="Add" action="#{myBean.addSomething(false)}"
id="add_something_id" >
<f:ajax render="@form someTable" execute="@form"
onevent="closeAddNewSomethingDialogIfSucceeded"></f:ajax>
</h:commandButton>
Y aquí está el código js para cerrar el diálogo.
function closeAddNewSomethingDialogIfSucceeded(data) {
if(data.status === ''success'') {
$("#dialog_id").dialog("close");
}
}
No hay problemas hasta aquí ...
Ahora cambié algunos de los campos del formulario de diálogo a required="true"
y ahora quiero evitar que se cierre el cuadro de diálogo de error de validación ...
Pero ajax data.status
aún alcanza su estado de success
, y no puedo averiguar qué indicación de error de validación puedo conectar ...
¿algunas ideas?
Gracias a la respuesta de BalusC hice lo siguiente:
en JSF, agregado:
<h:panelGroup id="global_flag_validation_failed_render">
<h:outputText id="global_flag_validation_failed" value="true"
rendered="#{facesContext.validationFailed}"/>
</h:panelGroup>
el f: ajax fue cambiado a
<f:ajax render="@form someTable global_flag_validation_failed_render"
y en js agregó el siguiente cheque.
if(data.status === ''success'') {
if($("#global_flag_validation_failed").length === 0){
$("#dialog_id").dialog("close");
}
}
Creo que deberías echar un vistazo al RequestContext PrimeFaces. Esto le ayudaría a activar el código del lado del cliente en el lado del servidor.
Dos cosas 1) Verificar un error en la función ''onevent''
Seguro que tienes una etiqueta de mensaje para el campo obligatorio?
<h:message id="m-my-field-id" for="my-field-id" errorClass="error-class"/>
Para que pueda comprobar la clase de error algo así como
var message = $(''#m-my-field-id'');
if(message.hasClass(''error-class''){
//do this
}
else{
//do that
}
2) El DOM no está actualizado en el éxito
Sí, puedo ver el mensaje en la página en Firefox, pero jQuery me dice que no está allí.
He encontrado que usar el menor tiempo de espera posible es suficiente para solucionar este problema
setTimeout(
function(){
setErrorStyle(source.attr(''id''));
},
1
);
No específicamente para required="true"
, pero puede verificar mediante #{facesContext.validationFailed}
si la validación ha fallado en general. Si combina esto con la verificación de si el botón en cuestión se presiona con #{not empty param[buttonClientId]}
, puede #{not empty param[buttonClientId]}
en el atributo rendered
de <h:outputScript>
siguiente manera:
<h:commandButton id="add_something_id" binding="#{add}" value="Add" action="#{myBean.addSomething(false)}">
<f:ajax execute="@form" render="@form someTable" />
</h:commandButton>
<h:outputScript rendered="#{not empty param[add.clientId] and not facesContext.validationFailed}">
$("#dialog_id").dialog("close");
</h:outputScript>
(tenga en cuenta que debe asegurarse de que la secuencia de comandos también sea representada por f: ajax)
Un poco intrincado, pero no es posible manejarlo en la función de onevent
ya que la implementación estándar de JSF no proporciona ninguna información sobre el estado de validación en la respuesta ajax.
Si usa RichFaces, entonces podría usar EL en el atributo oncomplete
del botón / enlace <a4j:xxx>
. En concreto, se evalúan en base a la solicitud en lugar de en base a la vista como en JSF estándar y PrimeFaces:
<a4j:commandButton ... oncomplete="if (#{!facesContext.validationFailed}) $(''#dialog_id'').dialog(''close'')" />
O si usa PrimeFaces, entonces podría aprovechar el hecho de que PrimeFaces amplía la respuesta ajax con un atributo args.validationFailed
adicional que se inyecta directamente en el alcance de JavaScript del atributo oncomplete
:
<p:commandButton ... oncomplete="if (args && !args.validationFailed) $(''#dialog_id'').dialog(''close'')" />
(tenga en cuenta que se ha usado &
lugar de &
, porque &
es un carácter especial en XML / XHTML)
O puede usar la API RequestContext
PrimeFaces en el método de acción del bean para ejecutar JavaScript mediante programación en la vista renderizada.
RequestContext.getCurrentInstance().execute("$(''#dialog_id'').dialog(''close'')");
No se necesitan comprobaciones condicionales, ya que el método de acción del bean no se invocará de todos modos cuando la validación haya fallado.