2009-09-17 30 views
6

Estoy intentando hacer una forma dinámica utilizando formularios Spring. Básicamente, el formulario obtiene un título de actividad de aprendizaje y luego está el botón a debajo que dice: "Agregar una actividad de aprendizaje más". Esto hace posible que el usuario agregue una actividad de aprendizaje más. Quiero que él pueda agregar todo lo que quiera.Formularios dinámicos en Spring

No he intentado esto antes, así que obviamente encontré errores con la primera solución que pensé. Realmente tuve una sensación de hacer lo que hice, se generará un error, sino sólo que lleve a casa lo que yo estoy tratando de hacer, aquí está el código:

<script language="javascript"> 
fields = 0; 
function addInput() { 
     document.getElementById('text').innerHTML += "<form:input path='activity[fields++].activity'/><br />"; 
} 

<div id="text"> 
    <form:form commandName="course"> 
    Learning Activity 1 
    <form:input path="activity[0].activity"/> 
    <input type="button" value="add activity" onclick="addInput()"/> 
    <br/><br/> 
    <input type="submit"/> 
    </form:form> 
    <br/><br/> 
</div> 

Respuesta

7

No puede usar < form:input> dentro de javascript porque es una etiqueta jsp que se ejecuta en el lado del servidor.

Sin embargo, no hay nada mágico acerca de cómo una entrada HTML se vincula a un campo en el objeto de comando Spring; solo se basa en el nombre. Por lo tanto, en su javascript, agregue un nuevo <input type="text" name="activity[1].activity"> (por ejemplo, obviamente aumentará el índice).

Otra opción que he usado para controles más complicados es tomar el HTML del control existente (que se creó con el formulario Spring: etiqueta de entrada) y clonarlo, reemplazando los índices con el número incrementado. Esto se vuelve mucho más fácil si usa jQuery.

EDITADO PARA AGREGAR: Un problema que puede causar problemas: está agregando su nuevo cuadro de entrada al final de su div exterior ("texto"), lo que significa que no está dentro de las etiquetas de formulario. Eso no funcionará

+0

He intentado hacer esto, pero los valores de los formularios generados no están vinculados a la clase de comando. Solo el que establecí explícitamente en el formulario de primavera está vinculado, por ejemplo, en el código anterior: Jeune

+0

"Un problema que puede causarle problemas: usted está agregando su nuevo cuadro de entrada al final de su div externo ("texto"), lo que significa que no está dentro de las etiquetas de formulario. Eso no funcionará ". He abordado esto, ya he añadido los nuevos cuadros de entrada dentro de otro div dentro de las etiquetas de formulario, aún los cuadros de entrada anexos no se enlazan. – Jeune

+1

¿Puedes dar un ejemplo de tu cuadro de entrada adjunto? He usado este enfoque para hacer exactamente esto y funciona. Un cuadro de entrada llamado "actividad [1] .actividad" debe vincularse al segundo elemento en su lista de actividades (suponiendo que tenga un campo de "actividad"), etc. –

1

Es <form:input> una etiqueta JSP? Si es así, entonces el Javascript del lado del cliente para agregar los nodos <form:input> al DOM no tendrá ningún efecto, ya que el motor JSP del lado del servidor no los está interpretando.

Su Javascript necesita trabajar con HTML sin formato y DOM, como agregar un elemento <input>.

+0

Sí, es una etiqueta jsp para Spring. Ya he pensado simplemente en forzar los formularios con solo obtener los parámetros de la solicitud directamente. Sin embargo, quería usar la habilidad SimpleFormController de Spring para vincular los campos de formulario a una clase de comando. Me preguntaba si hay una manera de hacerlo en mi situación. ¡Salud! – Jeune