2017-09-14 1 views
0

Eine Frage zu Apache Wicket: Ich habe ein Formular, das mehrere Texteingabefelder enthält. Es funktioniert gut, bis ich ein DateTextField hinzufüge. Die überschriebene Methode onSubmit() wird einfach nicht mehr aufgerufen. Ich habe mir die Wicket-Beispiele angeschaut, kann aber keinen großen Unterschied zu meinem Code feststellen.Warum wird die onSubmit-Methode des Formulars nicht aufgerufen, wenn ein DateTimeField vorhanden ist?

Hier ist der HTML-Code:

<html xmlns:wicket="http://wicket.apache.org"> 
 
\t <head> 
 
\t \t <title>Students</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <div class="container"> 
 
\t \t \t <form id="createStudent" wicket:id="createStudent"> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="lastNameLabel"><wicket:message key="lastNameLabel" /></span> 
 
\t \t \t \t \t <input id="lastName" wicket:id="lastName" type="text" /> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="firstNameLabel"><wicket:message key="firstNameLabel" /></span> 
 
\t \t \t \t \t <input id="firstName" wicket:id="firstName" type="text" /> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="dateOfBirthLabel"><wicket:message key="dateOfBirthLabel" /></span> 
 
\t \t \t \t \t <input id="dateOfBirth" wicket:id="dateOfBirth" type="text" /> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <input id="submit" type="submit" value="" wicket:message="value:submitLabel"/> 
 
\t \t \t \t </div> 
 
\t \t \t </form> 
 
\t \t </div> 
 
\t </body> 
 
</html>

Die entsprechende Java-Datei:

package it.foo; 

import java.util.Locale; 

import org.apache.wicket.Session; 
import org.apache.wicket.datetime.StyleDateConverter; 
import org.apache.wicket.datetime.markup.html.form.DateTextField; 
import org.apache.wicket.markup.html.form.Button; 
import org.apache.wicket.markup.html.form.Form; 
import org.apache.wicket.markup.html.form.TextField; 
import org.apache.wicket.model.CompoundPropertyModel; 
import org.apache.wicket.spring.injection.annot.SpringBean; 
import org.joda.time.DateTime; 

public class CreateStudentForm extends Form<Student> { 

private static final long serialVersionUID = 1L; 

private String lastName; 
private String firstName; 
private DateTime dateOfBirth; 

@SpringBean 
StudentDao studentDao; 

public CreateStudentForm(String id) { 
    super(id); 
    setDefaultModel(new CompoundPropertyModel<>(this)); 
    add(new TextField<String>("lastName")); 
    add(new TextField<String>("firstName")); 

    final DateTextField dateOfBirthField = new DateTextField("dateOfBirth", new StyleDateConverter("S-", true)) { 
     private static final long serialVersionUID = 1L; 

     @Override 
     public Locale getLocale() { 
      return Session.get().getLocale(); 
     } 
    }; 

    dateOfBirthField.setType(DateTime.class); 
    add(dateOfBirthField); 

} 

@Override 
protected void onSubmit() { 
    // does not get called as soon as the DateTextField is present. Works fine otherwise. 
    Student student = new Student(this.lastName, this.firstName, this.dateOfBirth); 
    studentDao.store(student); 
    setResponsePage(StudentsPage.class); 
} 

} 

Ich hatte einen Blick auf den HTML-Code, der im Browser gerendert wird. Wenn die dateTextField nicht vorhanden ist, sieht es so aus:

<html> 
 
\t <head> 
 
\t \t <title>Students</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <div class="container"> 
 
\t \t \t <form id="createStudent" method="post" action="./?2-1.IFormSubmitListener-createStudent"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="createStudent_hf_0" id="createStudent_hf_0" /></div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="lastNameLabel">Nachname: </span> 
 
\t \t \t \t \t <input id="lastName" type="text" value="" name="lastName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="firstNameLabel">Vorname:</span> 
 
\t \t \t \t \t <input id="firstName" type="text" value="" name="firstName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <!-- <div> 
 
\t \t \t \t \t <span id="dateOfBirthLabel"><wicket:message key="dateOfBirthLabel" /></span> 
 
\t \t \t \t \t <input id="dateOfBirth" wicket:id="dateOfBirth" type="text" /> 
 
\t \t \t \t </div> --> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <input id="submit" type="submit" value="Schüler anlegen"/> 
 
\t \t \t \t </div> 
 
\t \t \t </form> 
 
\t \t </div> 
 
\t </body> 
 
</html>

Sobald die dateTextField vorhanden ist, hat die Form zusätzliche Divisionen mit JavaScript-Aufrufe.

<html> 
 
\t <head> 
 
\t \t <title>Students</title> 
 
\t </head> 
 
\t <body> 
 
\t \t <div class="container"> 
 
\t \t \t <form id="createStudent" method="post" action="./?6-7.IFormSubmitListener-createStudent"><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="hidden" name="createStudent_hf_0" id="createStudent_hf_0" /></div><div style="width:0px;height:0px;position:absolute;left:-100px;top:-100px;overflow:hidden"><input type="text" tabindex="-1" autocomplete="off"/><input type="submit" tabindex="-1" name="p::submit" onclick=" var b=document.getElementById('submit'); if (b!=null&amp;&amp;b.onclick!=null&amp;&amp;typeof(b.onclick) != 'undefined') { var r = Wicket.bind(b.onclick, b)(); if (r != false) b.click(); } else { b.click(); }; return false;" /></div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="lastNameLabel">Nachname: </span> 
 
\t \t \t \t \t <input id="lastName" type="text" value="Matthias" name="lastName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="firstNameLabel">Vorname:</span> 
 
\t \t \t \t \t <input id="firstName" type="text" value="Tonhäuser" name="firstName"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <span id="dateOfBirthLabel">Geburtsdatum: </span> 
 
\t \t \t \t \t <input id="dateOfBirth" type="text" value="06.09.17" name="dateOfBirth"/> 
 
\t \t \t \t </div> 
 
\t \t \t \t <div> 
 
\t \t \t \t \t <input id="submit" type="submit" value="Schüler anlegen" name="p::submit"/> 
 
\t \t \t \t </div> 
 
\t \t \t </form> 
 
\t \t </div> 
 
\t </body> 
 
</html>

Ich verstehe nicht ganz, warum die zusätzlichen Spaltungen es plötzlich alle weg sind. Meine Vermutung ist, dass der JavaScript-Aufruf nicht funktioniert.

Danke.

+1

Können Sie eine 'Feedback panel' hinzufügen und tragen vor, dass Sie eine Vorstellung geben, was los ist? – soorapadman

+0

Wicket onSubmit wird nach erfolgreicher Validierung aufgerufen. Sie können onError überprüfen, vielleicht gibt es ein Problem –

Antwort

1

Es ist wahrscheinlich, dass die onSubmit()-Methode möglicherweise nicht aufgerufen wird, weil der Wert von dateField falsch überprüft wurde. Sie müssen feedback panel zu Ihrer Seite hinzufügen und überprüfen.

+0

Sie haben Recht. Ich habe ein Feedbackfeld hinzugefügt und eine Fehlermeldung angezeigt, dass der eingegebene Wert für die DateTime.class im falschen Format war. Also war mein Fehler, die falsche Klasse für das DateTextField zu setzen. Es muss sein: _dateOfBirthField.setType (Date.class); _ – ScarOnTheSky

1

können Sie überschreiben die onError(...) Methode und schauen, was los ist ..

+0

Es wird funktionieren, auch wenn Sie die Methode nicht überschreiben, auch weil das Formular nicht 'ajax submit' einreicht. Ich glaube, dass es ein Problem mit Datumskomponente geben muss, die das Problem verursacht, nicht zu zeigen, da Rückmeldung nicht vorhanden ist – soorapadman

Verwandte Themen