Los campos de entrada mantienen valores previos solo si la validación falló

Se me ocurrió un problema extraño. Traté de aislar el problema, así que seguir es mi código simplificado.

public class MyBean { private List dataList; Data selectedData; public MyBean() { dataList = new ArrayList(); dataList.add(new Data("John", 16)); dataList.add(new Data("William", 25)); } public List getDataList() { return dataList; } public void edit(Data data) { selectedData = data; } public void newData() { selectedData = new Data(null, null); } public Data getSelectedData() { return selectedData; } public class Data { String name; Integer age; Data(String name, Integer age) { this.name = name; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } } } 

xhtml:

   Name: 
Age :

#{data.name}

Este es el camino al error:

  1. Cargar la página
  2. Haga clic en el enlace “Editar” en la primera fila (aparece la ventana emergente)
  3. En una ventana emergente, borre el campo “Edad” y haga clic en “Guardar” (se muestra el mensaje obligatorio)
  4. Haga clic en cancelar (sin rellenar el campo “Edad”)
  5. Haga clic en el segundo enlace.
  6. Ahora muestra datos irrelevantes (datos previos). – Este es el problema
  7. Incluso cuando hago clic en el botón “Nuevo”, se muestran datos incorrectos.

Esto ocurre solo si falla una validación en la ventana emergente.
¿Existe alguna solucion para esto?

Este problema en JSF 2 también se reconoce y se explica en detalle en la siguiente respuesta: ¿Cómo puedo rellenar un campo de texto con PrimeFaces AJAX después de que se produzcan errores de validación? Si estaba usando JSF 2, podría haber usado OmniFaces ‘ ResetInputAjaxActionListener o PrimeFaces’ o resetValues="true" para esto.

Hasta el punto, necesita borrar el estado del componente EditableValueHolder cuando esté a punto de ser ajax, pero que no esté incluido en ajax-execute. Para borrar el estado, en JSF 2 habría utilizado el método de conveniencia resetValue() para esto, pero esto no está disponible en JSF 1.2 y necesita invocar los 4 métodos individuales setValue(null) , setSubmittedValue(null) , setLocalValueSet(false) , setValid(true) para borrar el estado.

Para averiguar qué componentes se deben representar ajax, pero no se han ejecutado ajax, en JSF 2 habría utilizado métodos PartialViewContext para esto, pero esto no está disponible en JSF 1.2 que aún no ha estandarizado ajax. Tendrás que jugar con la API específica de Ajax de RichFaces para darte cuenta. No puedo decir eso desde la cima de la cabeza, así que aquí hay un ejemplo inicial, asumiendo que ya sabes los componentes que necesitan ser eliminados. Imagine que el formulario de su ventana emergente tiene id="popForm" y el campo de entrada de nombre tiene id="nameInput" , así es como podría borrarlo dentro del método newData() :

 UIInput nameInput = (UIInput) context.getViewRoot().findComponent("popForm:nameInput"); nameInput.setValue(null); nameInput.setSubmittedValue(null); nameInput.setLocalValueSet(false); nameInput.setValid(true); 

hacer una cosa en cancelar acción establecer todos los valores emergentes nulo. ahora en su próximo clic todos los valores configurados para ser predeterminados.

o al hacer clic en establecer todos los valores anteriores nulo. y establecer todos los valores respectivos después de eso.

Yo tuve el mismo problema. si está utilizando Primefaces, la solución es tan simple como poner resetValues="true" en su p: commandLink or p: commandButton que carga el elemento seleccionado.

Intereting Posts