2009-09-17 15 views
6

Ich versuche, ein dynamisches Formular mit Spring-Formen zu erstellen. Im Grunde erhält das Formular einen Titel der Lernaktivität und dann gibt es die a-Schaltfläche darunter, die "Eine weitere Lernaktivität hinzufügen" enthält. Dies ermöglicht es dem Benutzer, eine weitere Lernaktivität hinzuzufügen. Ich möchte, dass er so viel hinzufügen kann, wie er möchte.Dynamische Formulare im Frühjahr

Ich habe das vorher nicht versucht, also offensichtlich habe ich Fehler mit der ersten Lösung gefunden, an die ich gedacht habe. Ich hatte wirklich das Gefühl, zu tun, was ich tat, wird einen Fehler generiert, sondern nur nach Hause fahre, was ich zu tun versuche, hier ist der Code:

<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> 

Antwort

7

Sie können < form:input> nicht innerhalb des Javascript verwenden, da es ein JSP-Tag ist, das auf der Serverseite ausgeführt wird.

Es ist jedoch nichts Magisches darüber, wie eine HTML-Eingabe an ein Feld im Spring-Befehlsobjekt gebunden wird. Es basiert nur auf dem Namen. Fügen Sie also in Ihrem Javascript einen neuen <input type="text" name="activity[1].activity"> hinzu (zum Beispiel - Sie erhöhen natürlich den Index). Eine andere Option, die ich für kompliziertere Steuerelemente verwendet habe, ist, den HTML-Code des vorhandenen Steuerelements (das mit dem Spring form: input-Tag erstellt wurde) zu klonen und es zu klonen, wobei die Indizes durch die inkrementierte Zahl ersetzt werden. Dies wird viel einfacher, wenn Sie jQuery verwenden.

BEARBEITEN ZUM HINZUFÜGEN: Ein Problem, das zu Problemen führen kann: Sie fügen Ihr neues Eingabefeld an das Ende Ihres äußeren div ("text") an, was bedeutet, dass es sich nicht in den form tags befindet. Das wird nicht funktionieren.

+0

Ich habe versucht, dies zu tun, aber die Werte der generierten Formulare sind nicht an die Befehlsklasse gebunden. Nur die, die ich explizit im Spring-Formular gesetzt habe, ist zB im obigen Code gebunden: Jeune

+0

"Ein Problem, das dir Probleme bereiten könnte: du hängst deine an neues Eingabefeld am Ende der äußeren div ("Text"), was bedeutet, dass es nicht innerhalb der Form-Tags ist. Das wird nicht funktionieren. " Ich adressiert dies bereits Ich habe die neuen Eingabefelder in einem anderen Div innerhalb der Form Tags angehängt, noch die angehängten Eingabefelder nicht binden. – Jeune

+1

Können Sie ein Beispiel für Ihr angehängtes Eingabefeld angeben? Ich habe diesen Ansatz verwendet, um genau dies zu tun und es funktioniert. Ein Eingabefeld mit dem Namen "activity [1] .activity" sollte an das zweite Element in Ihrer Aktivitätsliste gebunden sein (vorausgesetzt, es hat ein Feld "activity") usw. –

1

Ist <form:input> ein JSP-Tag? Wenn dies der Fall ist, hat clientseitiges JavaScript, um dem DOM <form:input> Knoten hinzuzufügen, keinen Effekt - da die serverseitige JSP-Engine diese nicht interpretiert.

Ihr Javascript muss mit Raw HTML und DOM arbeiten, z. B. ein <input> Element hinzufügen.

+0

Ja, es ist ein JSP-Tag für Spring. Ich habe daran gedacht, die Formulare bereits zu erzwingen, indem ich die Parameter direkt aus der Anfrage heraushole. Ich wollte jedoch die SimpleFormController-Funktion von Spring verwenden, um die Formularfelder an eine Befehlsklasse zu binden. Ich habe mich nur gefragt, ob es einen Weg gibt, es in meiner Situation zu tun. Prost! – Jeune