2012-05-08 13 views
7

¿Nunca se debe usar immediate="true" cuando se trata de un componente AJAXified JSF 2.0?¿Nunca se debe usar immediate = "true" cuando se trata de un componente AJAXified JSF 2.0?

El ejemplo podría ser:

Si quiero poner en práctica un botón "Cancelar" en la JSF página 2.0 en la que si el usuario pulsa "Cancelar", no hay validaciones deben correr, he de poner immediate="true" en el componente si ¿es un componente ajaxificado o debería especificar que no se procesen componentes en el formulario? Si es así, ¿cuál es la forma de implementar esta funcionalidad utilizando las características AJAXified del componente y no la "forma anterior" de usar immediate="true"?

Respuesta

10

De hecho, el propósito de utilizar immediate="true" en un botón de cancelación se ha convertido en inútil ya <f:ajax> la que sólo se puede configurar para execute="@this" (que es el que ya por defecto) para omitir el procesamiento de todos los componentes de entrada de la misma forma.

Es posible que solo tenga problemas cuando el formulario ya se haya enviado previamente pero haya fallado debido a un error de conversión/validación. Si presiona el botón cancelar por ajax y luego renderiza el formulario, las entradas se marcarán como no válidas y cualquier cambio en el valor del modelo no se reflejará (probablemente esté haciendo un entity = new Entity(); o algo en el método de cancelar acción para borrar el antiguo valores de la forma). Este problema no ocurre cuando se utiliza una solicitud síncrona (no Ajax) con immediate="true". Este problema en realidad no tiene nada que ver con immediate="true", pero con el ciclo de vida JSF de las solicitudes ajax. Básicamente necesita restablecer el estado invalidado de los componentes de entrada involucrados llamando al EditableValueHolder#resetValue() en los componentes que no están incluidos en el ajax execute, pero se incluyen en el ajax render. OmniFaces tiene un ResetInputAjaxActionListener para exactamente este propósito.

Cuestiones relacionadas