2011-11-02 8 views
6

Tengo un formulario de wicket que contiene muchos componentes de entrada de TextField. Hay un validador adjunto a la mayoría de estas entradas.¿Es posible devolver un error de retroalimentación, pero aún permitir que wicket actualice los modelos de componentes?

Supongamos que he ingresado 50 valores, y uno de ellos falla un validador de rango. Wicket luego genera un mensaje de respuesta de error, pero tampoco actualiza los modelos asociados con cada componente. El resultado es que pierdo todos los 50 valores que acabo de ingresar, y tengo que ingresarlos nuevamente.

Mi pregunta es, ¿puedo decirle a Wicket que actualice los modelos de los componentes que tenían valores válidos, pero simplemente informe un error por el valor incorrecto?

Excavando alrededor de la estructura, noté este fragmento de código en FormComponent, que parece indicar que, si hay un error, no actualice el modelo.

public final void processInput() 
{ 
    inputChanged(); 
    validate(); 
    if (hasErrorMessage()) 
    { 
     invalid(); 
    } 
    else 
    { 
     valid(); 
     updateModel(); 
    } 
} 

¿Hay alguna manera de personalizar este comportamiento y lograr mi objetivo de conservar todos los valores válidos?

+1

¿Qué tipo de validadores está utilizando? La entrada del usuario debe mantenerse, incluso si hay errores de validación. ¿Puede mostrar uno de esos validadores, cómo se adjunta a 'FormComponents' y cómo se gestiona el envío de formularios? –

Respuesta

7

Apostaría que FormComponent.processInput() no se está llamando en absoluto aquí. Cuando envía el Form, se llama al Form.process(). Allí, llamará al Form.validate(), que a su vez llamará al Form.validateComponents(), utilizando finalmente FormComponent.validate().

El problema que tiene aquí es el manejo global en Form.process(). El formulario se envía por completo o no se envía en absoluto. Cuando falla un FormComponent.validate(), Form.hasError() devolverá true, y por lo tanto Form.process() nunca actualizará ninguno de los modelos.

Usted podría:

  • Mover todas las validaciones independientes FormComponent a un FormValidator. Allí puede optar por actualizar los Modelos de aquellos FormComponents que pasan sus validaciones.
  • Implemente Form.onError() y utilice un visitante allí para actualizar los modelos de FormComponents válidos.
  • Modifique Form.process() y modifique la rama // If a validation error occurred para usar sus propios métodos para marcar los componentes como válidos/no válidos, y actualizar (o no) los objetos del modelo, dependiendo del FormComponent que tenga errores. FormComponent.hasErrorMessage() le dirá si la validación falló en un cierto FormComponent.

ACTUALIZACIÓN

Después de discutir las razones por las que la entrada del usuario se perdió con el PO, resultó que estaban siendo añadido el FormComponents en un ListView que no tenía setReuseItems conjunto de true. Esto causaba que FormComponents se creara de nuevo en cada ListView.populateItem(), perdiendo toda la entrada del usuario.

Más información sobre la naturaleza de este problema se puede encontrar here: sin embargo

Hay algunas disposiciones que hay que tener cuidado al utilizar un repetidor en forma.Por lo general, los repetidores limpian sus artículos al comienzo de cada solicitud, cuando dentro de un formulario esto generalmente es no deseado porque desea conservar los artículos viejos porque desea que mantengan su estado en lugar de volver a crearlo.

Por ejemplo, si se utiliza ListView, debe llamar ListView.setReuseItems (true) dentro del formulario por lo que conserva viejas artículos en vez de estar siempre creando nuevos cada vez.

+0

Debería haber mencionado que la página aquí es un DynamicWizardStep. –

+0

No he usado asistentes, pero no creo que eso haga la diferencia. Se incluirá en un '

' de todos modos, ¿no? –

+0

Sí, será Xavi, pero está algo escondido, lo que supongo que es la intención de usar DynamicWizard (extensiones de wicket). –

Cuestiones relacionadas