2009-09-17 13 views
6

Próbuję stworzyć dynamiczną formę za pomocą form sprężynowych. Zasadniczo formularz otrzymuje tytuł aktywności szkoleniowej, a następnie znajduje się pod nim przycisk z napisem "Dodaj jeszcze jedną aktywność edukacyjną". Dzięki temu użytkownik może dodać jeszcze jedno działanie edukacyjne. Chcę, żeby mógł dodać tyle, ile mu się podoba.Dynamiczne formy na wiosnę

Nie próbowałem tego wcześniej, więc oczywiście napotkałem błędy przy pierwszym rozwiązaniu, o którym myślałem. Naprawdę miałem wrażenie robi to, co zrobiłem wygeneruje błąd, ale po prostu nie jechać do domu, co próbuję zrobić, oto kod:

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

Odpowiedz

7

Nie można używać < form:input> w javascript, ponieważ jest to znacznik jsp, który działa po stronie serwera.

Jednak nie ma nic magicznego w tym, jak dane wejściowe HTML zostaną powiązane z polem w obiekcie polecenia Spring; opiera się tylko na nazwie. Więc w twoim javascriptu dodaj nowy <input type="text" name="activity[1].activity"> (na przykład - oczywiście zwiększysz indeks).

Inną opcją, której użyłem do bardziej skomplikowanych kontroli, jest pobranie kodu HTML istniejącego formantu (który został utworzony za pomocą formularza Spring: input tag) i sklonowanie go, zastępując indeksy zwiększoną liczbą. Staje się to o wiele łatwiejsze, jeśli używasz jQuery.

EDYCJA DO ADD: Jedna kwestia, która może powodować problemy: dodajesz nowe pole wprowadzania do końca zewnętrznego elementu div ("tekst"), co oznacza, że ​​nie ma go w tagach formularza. To nie zadziała.

+0

Próbowałem to zrobić, ale wartości wygenerowanych formularzy nie są powiązane z klasą polecenia. Tylko ten, który wyraźnie ustawiłem w formie sprężyny, jest związany np. W powyższym kodzie: Jeune

+0

"Jeden problem, który może powodować problemy: dołączasz nowe pole wejściowe na końcu zewnętrznego elementu div ("tekst"), co oznacza, że ​​nie ma go w tagach formularza. To nie zadziała. " Powiedziałem, że już dodałem nowe pola wejściowe wewnątrz innego elementu div w tagach formularza, nadal dołączone pola wejściowe nie wiążą się. – Jeune

+1

Czy możesz podać przykład dołączonego pola wprowadzania? Użyłem tego podejścia, aby zrobić dokładnie to i działa. Pole wejściowe o nazwie "activity [1] .activity" powinno wiązać się z drugim elementem na liście działań (zakładając, że ma pole "aktywności") itp. –

1

Czy <form:input> tag JSP? Jeśli tak, to JavaScript po stronie klienta, aby dodać węzły <form:input> do DOM, nie przyniesie żadnego skutku - ponieważ silnik JSP po stronie serwera ich nie interpretuje.

Twoja Javascript musi działać z surowym HTML i DOM, np. Dodając element <input>.

+0

Tak, to jest tag jsp na wiosnę. Myślałem już o brutalnym wymuszaniu formularzy już po otrzymaniu parametrów bezpośrednio z żądania. Jednak chciałem użyć Spring's SimpleFormController do wiązania pól formularza do klasy poleceń. Właśnie się zastanawiałem, czy jest sposób, aby to zrobić w mojej sytuacji. Pozdrawiam! – Jeune